try
์ด ์ ์์ ๋ง๊ฐ ๋์์ต๋๋ค.
์๊ฒฌ์ ์ ์ํ๊ธฐ ์ ์ ์ธ๋ถ ์ค๊ณ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ 6์ 6์ผ ํ์ฌ ํ ๋ก ์์ฝ, 6 ์ 10์ผ ์์ฝ ๋ฐ _๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ง์ค ์ ์ง์ ๋ํ ์กฐ์ธ _์ ์ฐธ์กฐํ์ญ์์ค. ๊ทํ์ ์ง๋ฌธ์ด๋ ์ ์์ ์ด๋ฏธ ๋ต๋ณ๋์๊ฑฐ๋ ์์ฑ๋์์ ์ ์์ต๋๋ค. ๊ฐ์ฌ ํด์.
Go์์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์์ฉ๊ตฌ if
๋ฌธ์ ์ ๊ฑฐํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ try
๋ผ๋ ์๋ก์ด ๋ด์ฅ ํจ์๋ฅผ ์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์ธ์ด ๋ณ๊ฒฝ์ ์ ์๋์ง ์์ต๋๋ค. ๊ธฐ์กด defer
๋ฌธ๊ณผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ณด๊ฐํ๊ฑฐ๋ ๋ํํ๋ ๊ฒ์ ์ง์งํฉ๋๋ค. ์ด ์ต์ ์ ๊ทผ ๋ฐฉ์์ ์ธ์ด์ ๋ณต์ก์ฑ์ ๊ฑฐ์ ์ถ๊ฐํ์ง ์์ผ๋ฉด์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ํด๊ฒฐํฉ๋๋ค. try
๊ธฐ๋ณธ ์ ๊ณต์ ์ค๋ช
ํ๊ธฐ ์ฝ๊ณ ๊ตฌํํ๊ธฐ ์ฝ๊ณ ๋ค๋ฅธ ์ธ์ด ๊ตฌ์ฑ๊ณผ ์ง๊ตํ๋ฉฐ ์๋ฒฝํ๊ฒ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ฐ๋ฆฌ๊ฐ ๋ฏธ๋์ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ฅผ ์ํ ๊ฒฝ์ฐ ๋ฉ์ปค๋์ฆ์ ํ์ฅํ ์ ์๋ ๊ธธ์ ์ด์ด์ค๋๋ค.
[์๋ ํ ์คํธ๋ ๋์์ธ ๋ฌธ์๋ฅผ ๋ณด๋ค ์ ํํ๊ฒ ๋ฐ์ํ๊ธฐ ์ํด ํธ์ง๋์์ต๋๋ค.]
try
๋ด์ฅ ํจ์๋ ๋จ์ผ ํํ์์ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค. ํํ์์ n+1๊ฐ์ ๊ฐ(์ฌ๊ธฐ์ n์ 0์ผ ์ ์์)์ผ๋ก ํ๊ฐ๋์ด์ผ ํ๋ฉฐ ์ฌ๊ธฐ์ ๋ง์ง๋ง ๊ฐ์ error
์ ํ์ด์ด์ผ ํฉ๋๋ค. (์ต์ข
) ์ค๋ฅ ์ธ์๊ฐ nil์ด๋ฉด ์ฒ์ n๊ฐ ๊ฐ(์๋ ๊ฒฝ์ฐ)์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋น ์ค๋ฅ์ ํจ๊ป ๋๋ฌ์ธ๋ ํจ์์์ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋
f, err := os.Open(filename)
if err != nil {
return โฆ, err // zero values for other results, if any
}
๋ก ๋จ์ํํ ์ ์์ต๋๋ค.
f := try(os.Open(filename))
try
๋ ์์ฒด์ ์ผ๋ก error
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์์์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํด๋น ๊ฒฐ๊ณผ๋ ํฌํจํ๋ ํจ์์ ๋ง์ง๋ง ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ฌ์ผ ํฉ๋๋ค.
์ด ์ ์์ ์๋
GopherCon์์ ๋ฐํ๋ ์๋ ์ด์ ๋์์ธ ์ ๋ณธ์ง๋ก ์ถ์ํฉ๋๋ค. ์ค๋ฅ ๋ณด๊ฐ ๋๋ ๋ํ์ด ํ์ํ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค. ๊ฒ์ฆ๋ if
๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋ defer
๋ฌธ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ "์ ์ธ"ํฉ๋๋ค.
defer func() {
if err != nil { // no error may have occurred - check for it
err = โฆ // wrap/augment error
}
}()
์ฌ๊ธฐ์ err
๋ ๋๋ฌ์ธ๋ ํจ์์ ์ค๋ฅ ๊ฒฐ๊ณผ ์ด๋ฆ์
๋๋ค. ์ค์ ๋ก, ์ ์ ํ ๋์ฐ๋ฏธ ํจ์๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ ์ธ์ ํ ์ค์ง๋ฆฌ๋ก ์ค์ฌ์ค๋๋ค. ์๋ฅผ ๋ค์ด
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
( ์ฌ๊ธฐ์ fmt.HandleErrorf
๋ *err
$ ๋ฅผ ์ฅ์ํจ) ์ฝ๊ธฐ๊ฐ ์ ๋๋ฉฐ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ ์์ด๋ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ๋จ์ ์ ์ค๋ฅ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ฏ๋ก API๊ฐ ๋ ์๋ป์ง ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์ด๊ฒ์ ์คํ์ผ์ ๋ฌธ์ ์ด๋ฉฐ ์ธ๋ฏธ์ฝ๋ก ์ด ์๋ ๊ฒ์ ์ ์ํ ๊ฒ์ฒ๋ผ ์๋ก์ด ์คํ์ผ์ ๊ธฐ๋ํ๋ ๋ฐ์๋ ์ ์ํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์์ฝํ๋ฉด, try
๋ ์ฒ์์๋ ์ด์ํด ๋ณด์ผ ์ ์์ง๋ง, ํ๋์ ํน์ ์์
, ๋ ์ ์ ์์ฉ๊ตฌ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ํด๋น ์์
์ ์ถฉ๋ถํ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง์ถคํ๋ ๊ตฌ๋ฌธ ์คํ์
๋๋ค. ๋ฐ๋ผ์ ๋ฐ๋์ ์ฒ ํ์ ์ ๋ง์ต๋๋ค. try
๋ _๋ชจ๋ _ ์ค๋ฅ ์ฒ๋ฆฌ ์ํฉ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค. ๋์์ธ์ ๋จ์ํ๊ณ ๋ช
ํํ๊ฒ ์ ์งํ๊ธฐ ์ํด _๊ฐ์ฅ ์ผ๋ฐ์ ์ธ_ ๊ฒฝ์ฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ด ์ ์์ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๋ฐ์ ํผ๋๋ฐฑ์ ํฌ๊ฒ ์ํฅ์ ๋ฐ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์์์ ์์ด๋์ด๋ฅผ ๋น๋ฆฝ๋๋ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
try
์ ์ํฅ์ ํ์ํ๊ธฐ ์ํ tryhard
๋๊ตฌ๋๋ ์ด๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ๋จ์ํ ๋์์ธ์ผ๋ก ํด๊ฒฐํ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๋๋ ์์ ๊ฑฐ๋ฅผ ํ๊ณ ์ถ์ง ์์ง๋ง(์ด ๋ํ๋ฅผ ์ฐ๊ธฐํด๋ ๋ฌด๋ฐฉํฉ๋๋ค), Rust๋ ๊ฑฐ๊ธฐ์ ๊ฐ์ ๊ฒฐ๊ตญ ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด ๋ด์ฅ ํจ์๊ฐ ์๋ ?
์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ก ์ ์ฐฉํ์ต๋๋ค.
gophercon ์ ์์ ๊ณ ๋ ค๋ ์์ด๋์ด์์ ?
๋ฅผ ์ธ์ฉํ๊ณ ๊ทธ๊ฒ์ด ํ๊ธฐ๋ ์ธ ๊ฐ์ง ์ด์ ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํค์๋์ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ๊ฒ์ฌ๋ ์ํํด์ผ ํฉ๋๋ค.") ๋ ์ด์ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋ ๋ฒ์งธ๋ ๋ฌธ์ฒด์
๋๋ค. ์ ๋ฏธ์ฌ ์ฐ์ฐ์๊ฐ ์ฐ๊ฒฐ์ ๋ ์ ์๋ํ๋๋ผ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๋ ๋๋น ์ง ์ ์์ต๋๋ค.
check io.Copy(w, check newReader(foo))
๋ณด๋ค๋:
io.Copy(w, newReader(foo)?)?
ํ์ง๋ง ์ด์ ์ฐ๋ฆฌ๋ ๋ค์์ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
try(io.Copy(w, try(newReader(foo))))
ํธ์ถ๋๋ ์ฃผ์ ๊ธฐ๋ฅ์ด ๋ ์ด์ ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ช ํ ์ธ ๊ฐ์ง๊ฐ ๋ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ๋ด ์๊ฒฌ์ ์์ง๋ ?
๋ฅผ ์ฌ์ฉํ์ง ์๋ gophercon ์ ์์์ ์ธ์ฉ๋ ์ธ ๊ฐ์ง ์ด์ ๋ชจ๋๊ฐ ์ด try
์ ์์ ์ ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ?
๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ์ด ๋์ผ๋ฉฐ ๋ช
๋ น๋ฌธ ๊ตฌ์กฐ(๋ด๋ถ ํจ์ ํธ์ถ ๊ณ์ธต ํฌํจ)๋ฅผ ๊ฐ๋ฆฌ์ง ์์ผ๋ฉฐ ์ฐ๊ฒฐ ๊ฐ๋ฅํฉ๋๋ค. ์ ์๋ try()
๋ณด๋ค ์ ์ด ํ๋ฆ์ ๋ฐฉํดํ์ง ์์ผ๋ฉด์ ๋ณด๊ธฐ์์ ๋ ๋ง์ ํผ๋์ ์ ๊ฑฐํฉ๋๋ค.
๋ช ํํ ํ๊ธฐ ์ํด:
ํ๋ค
func f() (n int, err error) {
n = 7
try(errors.New("x"))
// ...
}
๋ฐํ (0, "x") ๋๋ (7, "x")? ๋๋ ํ์๋ฅผ ๊ฐ์ ํ ๊ฒ์ด๋ค.
๋ด๋ถ ๋์ฐ๋ฏธ ํจ์์ ๊ฐ์ด ์ฅ์์ด๋ ์ฒ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐํ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๊น? ๋๋ ๊ทธ๋ ์ง ์๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ทํ์ ์๋ 7, errors.New("x")
๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ณง ์ ์ถ๋ ์ ์ฒด ๋ฌธ์(https://golang.org/cl/180557)์์ ๋ช
ํํด์ผ ํฉ๋๋ค.
try
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๋ฅ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ง์ ํ ํ์๋ ์์ต๋๋ค. ํจ์๊ฐ ์ง์ฐ๋ ํจ์ ๋๋ ๋ค๋ฅธ ๊ณณ์์ ์ฐธ์กฐํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
ํธ์ถ์์ ์ ์ด ํ๋ฆ์ ์ํฅ์ ์ฃผ๋ ๋ด์ฅ _function_์ด ์ ๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค. Go 1์ ์ ํค์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ์ฌ์ค์ ๊ฐ์ฌํ์ง๋ง, ๋ง๋ฒ์ ๋ด์ฅ ํจ์๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ด์ฅ ๊ธฐ๋ฅ์ ์๋์์ ์ ์ด ํ๋ฆ ๋ณ๊ฒฝ๋งํผ ์์ธกํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค.
๋๋ ์ ๋ฏธ์ฌ ?
๊ฐ ๋ณด์ด๋ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์์ง๋ง ์ฌ์ ํ try()
๋ฅผ ๋ฅ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง: ๊ธ์, ๋๋ ํจ๋์ด ์กด์ฌํ๊ณ ํค์๋๊ฐ ์๋๋ผ๋ ๊ฒ์ ์์ ํ ์์ด๋ฒ๋ ธ์ต๋๋ค.
์์ธํ ์ ์์ ํ์ฌ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ (ํ์ ๊ฐ์ ๋๊ธฐ ์ค์ด๋ฉฐ ๊ณง ์ ๊ณต๋ ์์ ์) ๋ง์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@dominikh ์์ธํ ์ ์์ ์ด์ ๋ํด ๊ธธ๊ฒ ์ค๋ช
ํ์ง๋ง panic
๋ฐ recover
๋ ์ ์ด ํ๋ฆ์๋ ์ํฅ์ ์ฃผ๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์
๋๋ค.
๊ฐ์ ์ ์ํ ํ ๊ฐ์ง ์ค๋ช /์ ์:
if the last argument supplied to try, of type error, is not nil, the enclosing functionโs error result variable (...) is set to that non-nil error value before the enclosing function returns
๋์ is set to that non-nil error value and the enclosing function returns
๋ผ๊ณ ํ ์ ์์ต๋๊น? (๋ค/์ /๊ทธ๋ฆฌ๊ณ )
์ฒ์ ์ฝ์ ๋ before the enclosing function returns
๋ ๋ฏธ๋์ ์ด๋ค ์ง์ ์์ ํจ์๊ฐ ๋ฐํ๋๊ธฐ ์ง์ ์ ์ค๋ฅ ๊ฐ์ _eventually_ ์ค์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ์๋ง๋ ๋์ค ์ค์ ์์ ๊ฒ์
๋๋ค. ์ฌ๋ฐ๋ฅธ ํด์์ try๋ก ์ธํด ํ์ฌ ํจ์๊ฐ ๋ฐํ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ํ์ฌ ์ธ์ด์ ๋ํ ๋๋ผ์ด ๋์์ด๋ฏ๋ก ๋ ๋ช
ํํ ํ
์คํธ๊ฐ ํ์๋ฐ์ ๊ฒ์
๋๋ค.
๋๋ ์ด๊ฒ์ด ๋จ์ง ์คํ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์์์ ๋ณด์ปฌ ๋ฐ๋์๊ฐ if err != nil ...
๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์
๋ ฅํ๋ ๊ฒ์ ๋ํด golang์ ์กฐ๋กฑํ๊ณ ๋๊ตฐ๊ฐ๋ ๊ทธ๊ฒ์ ์ง์งํ๊ฒ ๋ฐ์๋ค์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค. ์ ์ผํ๊ฒ ๋๋ฝ๋ ๊ฒ์ ๋ค์ ๋ ๊ฐ์ง ๋ด์ฅ ๊ธฐ๋ฅ์
๋๋ค.
์ ๋๊ตฐ๊ฐ๊ฐ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์์ฑํ๋์ง ํ์คํ์ง ์์ง๋ง ์์๋๋ ์ถ๋ ฅ์ ๋ฌด์์ ๋๊น?
try(foobar())
foobar
๊ฐ (error, error)
$๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ
์ ์ด ํ๋ฆ์ ๋ํ ์ด์ ์ฐ๋ ค๋ฅผ ์ฒ ํํ๊ณ ๋ ์ด์ ?
์ฌ์ฉ์ ์ ์ํ์ง ์์ต๋๋ค. ๊ฐ์์ค๋ฌ์ด ๋ต๋ณ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค(์ ์ฒด ์ ์์ด ์ ๊ณต๋ _์ดํ_ ๋ฌธ์ ๊ฐ ์ ์ถ๋์๋ค๋ฉด ์ด๋ฐ ์ผ์ด ๋ฐ์ํ์ง ์์์ ๊ฒ์ด๋ผ๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค).
๋๋ ๋จ์ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ํ์์ฑ์ ๋์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ด ์ง๋ ์ธ์์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ ์์์ ๋ช
์๋ try
๋ ๊ฐ์ฅ ๋์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@webermaster ๋ง์ง๋ง error
๊ฒฐ๊ณผ๋ง ์ ์ ๋ฌธ์์ ์ค๋ช
๋ ๋๋ก try
์ ์ ๋ฌ๋ ํํ์์ ๋ํด ํน๋ณํฉ๋๋ค.
@dominikh ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ ๋จ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํ์์ฑ์ ๋์ํ์ง ์์ต๋๋ค.
์์ง์ ๋ณต์ก์ฑ์ ์ํ์ ๋ณต์ก์ฑ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ๊ฑฐ์ ์ข์ ์๊ฐ์ด ์๋๋๋ค.
๊ทธ๋ฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ ๋จ์ํํ๋ ๊ฒ ์ฌ์ด์์ ์ ๋์ ์ผ๋ก ์ ํํด์ผ ํ๋ค๋ฉด ์ด๊ฒ์ด ๋ด๊ฐ ์ ํธํ๋ ์ ์์ด ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ณํ์ด ๋ค์ ์์ด ์ฝ๊ฒ ์ํ๋ ์ ์๋ ์ค๋ฅ ๋ฐํ ํจ์์ ์ผ๋ถ ํ์ ์งํฉ์์ try
๋ฅผ ์ฌ์ฉํ๋๋ก Go ์ฝ๋๋ฅผ ๋ณํํ๋ ๋๊ตฌ์ ํจ๊ป(์ผ๋ถ ์น์ธ ๋จ๊ณ์์) ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋ฏธ ๋ณ๊ฒฝ. ์ธ ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค.
try
๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋น ๋ฅด๊ฒ ์ดํดํ ์ ์์ต๋๋ค.try
๊ฐ Go์ ๋ฏธ๋ ๋ฒ์ ์ ํฌํจ๋๋ค๋ฉด ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค. ์ฌ์ด ์ฌ๋ก๋ฅผ ์๋ํํ๋ ๋๊ตฌ๊ฐ ์์ผ๋ฉด ๋ง์ ๋์์ด ๋ ๊ฒ์
๋๋ค.try
๋ฅผ ์ฌ์ฉํ๋๋ก ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๊ท๋ชจ ๊ตฌํ์ ํจ๊ณผ๋ฅผ ์ฝ๊ฒ ์กฐ์ฌํ ์ ์์ต๋๋ค. (์ ํ์ฑ, ์ฑ๋ฅ, ์ฝ๋ ํฌ๊ธฐ ๋ฑ) ํ์ง๋ง ๊ตฌํ์ ์ด๋ฅผ ๋ฌด์ํด๋ ๋ ์ ๋๋ก ๊ฐ๋จํ ์ ์์ต๋๋ค.try(foo())
์ค์ ๋ก ํธ์ถ ํจ์๋ฅผ ๋น ์ ธ๋๊ฐ๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํจ์ ํ๋ฆ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์๊ฐ์ ์ ํธ๋ฅผ ์ฐ๋ฆฌ์๊ฒ์ ๋นผ์์๊ฐ๋ค๊ณ ์๊ฐํ๋ค๋ ๊ฒ์ ํํํ๊ณ ์ถ์ต๋๋ค.
์ถฉ๋ถํ ์ต์ํด์ง๋ฉด try
๋ก ์์
ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ฝ๋ ๋ฆฌ๋ทฐ์์ ์์์ ํ๋ฆ์ ํจ์จ์ ์ผ๋ก ์ธ์ํ๋ ค๋ฉด try
๋ฅผ ๊ฐ์กฐ ํ์ํ๊ธฐ ์ํด ์ถ๊ฐ IDE ์ง์(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. /๋๋ฒ๊น
์ธ์
๋ด๊ฐ ๊ฐ์ฅ ๊ฑฑ์ ํ๋ ๊ฒ์ defer ๋ฌธ์ด ๋ง์กฑํ๋๋ก ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ๊ฐ์ง ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ปค๋ฎค๋ํฐ์์ ๋ถํํ๋ ์ ๋ฐ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๋ if err != nil
์ ์์ฉ๊ตฌ์ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์กฐํฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. FAQ์๋ ํ์๊ฐ ์๋์ ์ผ๋ก ๋ณ๋์ ๋ฌธ์ ๋ก ์๋ต๋์๋ค๊ณ ๋ถ๋ช
ํ ๋ช
์๋์ด ์์ง๋ง, ๊ทธ๋ฌ๋ฉด ์ด๊ฒ์ด ๋ถ์์ ํ ํด๊ฒฐ์ฑ
์ด ๋ ๊ฒ ๊ฐ์ง๋ง ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์๊ฐํ ํ ๊ธฐํ๋ฅผ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
err
๋ฅผ ์ ์ธํฉ๋๋ค.func sample() (string, error) {
var err error
defer fmt.HandleErrorf(&err, "whatever")
s := try(f())
return s, nil
}
if err != nil
์์ฉ๊ตฌ๊ฐ ์๋ ๋์ฐ๋ฏธ wrapf
ํจ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.func sample() (string, error) {
s, err := f()
try(wrapf(err, "whatever"))
return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
if err != nil {
// err = wrapped error
}
return err
}
๋ ์ค ํ๋๊ฐ ์๋ํ๋ฉด ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
func sample() (string, error) {
var err error
defer fmt.HandleErrorf(&err, "whatever")
s := try(f())
return s, nil
}
์๋ํ์ง ์์ต๋๋ค. ์ง์ฐ์ ๋ฐํ ๊ฐ๊ณผ ๊ด๋ จ์ด ์๋ ๋ก์ปฌ err
๋ณ์๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
func sample() (string, error) {
s, err := f()
try(wrapf(err, "whatever"))
return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
if err != nil {
// err = wrapped error
}
return err
}
์๋ํด์ผ ํฉ๋๋ค. ํ์ง๋ง nil ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋ wrapf๋ฅผ ํธ์ถํฉ๋๋ค.
์ด๊ฒ์ ๋ํ (๊ณ์) ์๋ํ๋ฉฐ IMO๊ฐ ํจ์ฌ ๋ช
ํํฉ๋๋ค.
func sample() (string, error) {
s, err := f()
if err != nil {
return "", wrap(err)
}
return s, nil
}
์๋ฌด๋ try
๋ฅผ ์ฌ์ฉํ๊ฒ ๋ง๋ค์ง ์์ ๊ฒ์
๋๋ค.
์ ๋๊ตฐ๊ฐ๊ฐ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์์ฑํ๋์ง ํ์คํ์ง ์์ง๋ง ์์๋๋ ์ถ๋ ฅ์ ๋ฌด์์ ๋๊น?
try(foobar())
foobar
๊ฐ(error, error)
$๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ
ํจ์์์ ๋ ์ด์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํจ์์์ ๋ ์ด์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ํจ์๋ ์ฒ์์ ๊ฐ๊ฐ ํ๋์ ์ค๋ฅ๋ง ๋ฐํํ๋ ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ฅ๋ก ๋ถํ ๋์ด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@cespare : ๋๊ตฐ๊ฐ try
๋ฅผ ์ฌ์ฉํ๋๋ก try
์ ์ ํฉํ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๋ go fix
๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋จ์ํ๋ ์ ์๋์ง ๊ฐ์ ์ก๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. try
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์ถ๋ ฅ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ ์งง์ ์์ค ์ฝ๋๋ก ๊ณตํต ํจํด์ ๋์ฒดํ๋ ๋จ์ํ ๊ตฌ๋ฌธ ์คํ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋ ํฌ๊ธฐ๋ ์ฑ๋ฅ์ ํฐ ๋ณํ๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๋ํ try
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ ์ ์ด๋ try
๊ฐ ๋์
๋ ๋ฒ์ ์ธ Go ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@lesrrat : try
๊ฐ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ IDE๊ฐ ๊ทธ๊ฒ์ ์ถฉ๋ถํ ์ฝ๊ฒ ๊ฐ์กฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@Goodwine : @randall77 ์ด ์ด๋ฏธ ์ง์ ํ๋ฏ์ด ์ฒซ ๋ฒ์งธ ์ ์์ ์๋ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๊ฐํ ํ ๊ฐ์ง ์ต์
(๋ฌธ์์์๋ ๋
ผ์๋์ง ์์)์ error
๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๋ฏธ๋ฆฌ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์
๋๋ค(์ฒ์์ ์กด์ฌํ๋ ๊ฒฝ์ฐ). ๊ทธ๋ฌ๋ฉด defer
์์ ์ฌ์ฉํ ์ ์๋๋ก ๊ฒฐ๊ณผ ์ด๋ฆ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํจ์ฌ ๋ ๋ง์ ์ ์ผ ๊ฒ์
๋๋ค. ์ ๋นํ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐํ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฌธ์ ๋ ๋ณธ์ง์ ์ผ๋ก ์ธ๊ด์ ๋ฌธ์ ์ด๋ฉฐ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ go doc
๋ฐ ์น๊ตฌ๋ค์ด ์ ๊ณตํ๋ ์๋ ์์ฑ API์
๋๋ค. ์ด๋ฌํ ๋๊ตฌ์์ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค(์ด ์ฃผ์ ์ ๋ํ ์์ธํ ๋์์ธ ๋ฌธ์์ FAQ ์ฐธ์กฐ).
@nictuku : ์ค๋ช ์ ์ํ ๊ทํ์ ์ ์์ ๊ดํ์ฌ(s/before/and/): ๊ทํ๊ฐ ์ธ๊ธํ๋ ๋จ๋ฝ ๋ฐ๋ก ์์ ์ฝ๋๊ฐ ์ ํํ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๋ช ํํ๊ฒ ํด์ค๋ค๊ณ ์๊ฐํ์ง๋ง, ๊ทํ์ ์์ ์ s/before/and/ ์ ์์ต๋๋ค. ์ฐ๋ฌธ์ ๋ ๋ช ํํ๊ฒ ๋ง๋์ญ์์ค. ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
CL 180637 ์ ์ฐธ์กฐํ์ญ์์ค.
๋๋ ์ฌ์ค ์ด ์ ์์ ์ ๋ง ์ข์ํ๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๋นํ์ด ์์ต๋๋ค. Go์์ ํจ์์ ์ข
๋ฃ์ ์ ํญ์ return
๋ก ํ์๋์์ต๋๋ค. ํจ๋์ ๋ํ ์ถ๊ตฌ ์ง์ ์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ์ง ์์ ์น๋ช
์ ์ธ ์ค๋ฅ์
๋๋ค.
return
๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ํจ์์ ์ข
๋ฃ์ ์ ๋ง๋ค๋ฉด ์ฝ๋ ๊ฐ๋
์ฑ์ด ํจ์ฌ ๋ฎ์์ง ์ ์์ต๋๋ค. ๋๋ ๊ฐ์ฐ์์ ์ด์ ๋ํด ๋ค์๊ณ ์ด ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง์ ๋ํ ์๋ฆ๋ค์์ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
func CopyFile(src, dst string) error {
r, err := os.Open(src)
if err != nil {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
defer r.Close()
w, err := os.Create(dst)
if err != nil {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
if _, err := io.Copy(w, r); err != nil {
w.Close()
os.Remove(dst)
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
if err := w.Close(); err != nil {
os.Remove(dst)
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}
์ด ์ฝ๋๋ ํฐ ํผ๋์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฉฐ ์ค๋ฅ ์ฒ๋ฆฌ ์ด์์ ์ํด _์๋๋_ ๊ฒ์ด์ง๋ง try
๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฝ๋์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
func CopyFile(src, dst string) error {
defer func() {
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}()
r, err := try(os.Open(src))
defer r.Close()
w, err := try(os.Create(dst))
defer w.Close()
defer os.Remove(dst)
try(io.Copy(w, r))
try(w.Close())
return nil
}
์ธ๋ป ๋ณด๊ธฐ์ ์ด ์ฝ๋๊ฐ ๋ ๋ซ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ํจ์ฌ ์ ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ ์์ ์์ ํจ์๊ฐ ๋ฐํํ ๋ชจ๋ ์ง์ ์ ์ฐพ๋ ๊ฒ์ ๋งค์ฐ ์ฌ์ ์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ๋ค์ฌ์ฐ๊ธฐ๋์ด return
๋ก ์์ํ๊ณ ๊ทธ ๋ค์ ๊ณต๋ฐฑ์ด ์ต๋๋ค. ์ด๋ ๋ชจ๋ ์กฐ๊ฑด๋ถ ๋ฐํ์ด _๋ฐ๋์_ ์กฐ๊ฑด๋ถ ๋ธ๋ก ์์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ gofmt
ํ์ค์ ๋ฐ๋ผ ๋ค์ฌ์ฐ๊ธฐ๋ฉ๋๋ค. return
๋ ๋ํ ์์์ ์ธ๊ธํ๋ฏ์ด ์น๋ช
์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ์๋ฆฌ์ง ์๊ณ ํจ์๋ฅผ ์ข
๋ฃํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค. ๋ ๋ฒ์งธ ์์์๋ return
ํ๋๋ง ์์ผ๋ฏ๋ก _ever_ ํจ์๊ฐ ๋ฐํํด์ผ ํ๋ ๊ฒ์ nil
๋ฟ์ธ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๋ง์ง๋ง ๋ ๊ฐ์ try
ํธ์ถ์ ์ฝ๊ฒ ๋ณผ ์ ์์ง๋ง ์ฒ์ ๋ ๊ฐ๋ ์ฝ๊ฐ ๋ ์ด๋ ต๊ณ proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1]))))
์ ๊ฐ์ ์ด๋๊ฐ์ ์ค์ฒฉ๋์ด ์์ผ๋ฉด ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค.
ํจ์์์ ๋ณต๊ทํ๋ ๊ฒ์ "์ ์ฑํ" ์ผ์ธ ๊ฒ ๊ฐ์์ต๋๋ค. ๊ทธ๋์ ๊ฐ์ธ์ ์ผ๋ก ํจ์์ ๋ชจ๋ ์ข
๋ฃ์ ์ return
๋ก ํ์๋์ด์ผ ํ๋ค๊ณ ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํฉ๋๋ค.
๋๊ตฐ๊ฐ๋ ์ด๋ฏธ 5๋
์ ์ ์ด๊ฒ์ ๊ตฌํํ์ต๋๋ค. ๋น์ ์ด ๊ด์ฌ์ด ์๋ค๋ฉด, ๋น์ ์ ํ ์ ์์ต๋๋ค
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํด๋ณด์ญ์์ค
https://news.ycombinator.com/item?id=20101417
5๋ ์ Go์์ AST ์ ์ฒ๋ฆฌ๊ธฐ๋ก try()๋ฅผ ๊ตฌํํ๊ณ ์ค์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋๋ฐ ๊ฝค ์ข์์ต๋๋ค. https://github.com/lunixbochs/og
๋ค์์ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ๋ง์ ๊ธฐ๋ฅ์์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์์ ๋๋ค. https://github.com/lunixbochs/poxd/blob/master/tls.go#L13
๋๋ ์ด๊ฒ์ ๋ค์ด๊ฐ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ง๊ธ๊น์ง ๋ณธ ์๋ฃจ์ ์ค ๊ฐ์ฅ ๊ณผ๊ฐํ ์๋ฃจ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ๋๋ฒ๊น ํ ๋ ๋ง์ ์์ ์ ๋์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ฒ๊น ํ ๋๋ง๋ค ์๋๋ฅผ ํ๊ณ if ๋ธ๋ก์ ์ถ๊ฐํ๊ณ ์๋ฃ๋๋ฉด ๋ค์ ๋ํํ๋ ๊ฒ์ ์ง๋ฃจํฉ๋๋ค. ๋ํ ๊ณ ๋ คํด์ผ ํ ๋ง๋ฒ์ ์ค๋ฅ ๋ณ์์ ๋ํด ์ฝ๊ฐ์ ์ค์นํจ์ด ์์ต๋๋ค. ๋๋ ๋ช ์์ ์ธ ์ค๋ฅ ๊ฒ์ฌ๋ก ์ธํด ๊ท์ฐฎ๊ฒ ํ ์ ์ด ์์ผ๋ฏ๋ก ์๋ง๋ ๋ด๊ฐ ๋ฌผ์ด๋ณผ ์๋ชป๋ ์ฌ๋์ผ ๊ฒ์ ๋๋ค. ํญ์ "๋๋ฒ๊ทธํ ์ค๋น๊ฐ ๋์๋ค"๋ ๋๋์ ๋ฐ์์ต๋๋ค.
@griesemer
์ค๋ฅ ๋ํ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ํ defer ์ฌ์ฉ์ ๋ํ ๋ด ๋ฌธ์ ๋ ๋ด๊ฐ ๋ณด์ฌ์ค ์ค๋ํซ(์๋์์ ๋ฐ๋ณต๋จ)์ ๋์์ด ๋งค์ฐ ์ผ๋ฐ์ ์ธ AFAICT๊ฐ ์๋๋ฉฐ ๋งค์ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ์ด๊ฒ์ด ์๋ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์์ฑํ๋ ๊ฒ์ ์์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ ๋.
์๋ฅผ ๋ค์ด .. ์ด๋ณด์๋ ์ด๊ฒ์ ์์ง ๋ชปํฉ๋๋ค. ์ด ๋๋ฌธ์ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉด "๋ฌผ๋ก ์ด๋ฆ์ด ์ง์ ๋ ๋ฐํ์ด ํ์ํฉ๋๋ค."๋ผ๊ณ ํ์๋์ง ์๊ณ ์๋ํด์ผ ํ์ง๋ง ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํธ๋ ์ค๋ฅผ ๋ฐ์ ๊ฒ์ ๋๋ค.
var err error
defer fmt.HandleErrorf(err);
try
๋ ์ด๋ฏธ ๋๋ฌด ๋ง์ ์ ์ด๋ฏ๋ก ๋๊น์ง ๊ฐ์ ์์์ ์ค๋ฅ ๊ฐ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ๋ฐ๋์ ๋ชจ๋ ๋์์ค๋ฅผ ์๋ ์ฌ๋์ด ์๋๋ผ ์ด๋ณด์๋ฅผ ์๊ฐํ์ญ์์ค. ์ถฉ๋ถํ ๋ช
ํํ์ง ์์ผ๋ฉด ์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ
์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋... ์ด์ ๊ฐ์ด defer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํ์ง ๋ง๊ณ ๋ ์์ ํ์ง๋ง ์ฌ์ ํ ์ฝ์ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๋ํ์ญ์์ค.
@deanveloper ์ด ์ ์(๊ทธ๋ฆฌ๊ณ ๋์ผํ ๊ฒ์ ์๋ํ๋ ๋ชจ๋ ์ ์)์ด ์์ค ์ฝ๋์์ ๋ช
์์ ์ผ๋ก ๋ณด์ด๋ return
๋ฌธ์ ์ ๊ฑฐํ๋ค๋ ๊ฒ์ ์ฌ์ค์
๋๋ค. ์ด๊ฒ์ด ๊ฒฐ๊ตญ ์ ์์ ์์ ์
๋๋ค. ๊ทธ๋ ์ง ์์? if
๋ฌธ๊ณผ returns
์ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ๋ชจ๋ ๋์ผํฉ๋๋ค. return
try
๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
์ฐ๋ฆฌ๋ return
๋ฌธ(๋ฐ panic
)์ ์ฆ์ ์ธ์ํ๋ ๋ฐ ์ต์ํฉ๋๋ค. Go(๋ฐ ๊ธฐํ ๋ง์ ์ธ์ด)์์ ์ด๋ฌํ ์ข
๋ฅ์ ์ ์ด ํ๋ฆ์ด ํํ๋๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ $# return
8$#$ ์์ ํ๋ ๊ฒ์ฒ๋ผ ์ผ๋ถ๊ฐ ์ต์ํด์ง๋ฉด try
๋ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์ธ์ํ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ข์ IDE ์ง์์ด ์ด๊ฒ์๋ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ด ์์ฌ์น ์์ต๋๋ค.
๋ ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
๋ด ๊ฒฝํ์ ๊ฐ ํธ์ถ ์ฌ์ดํธ ์งํ์ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๋ช ๋ ๋ฐํ์ ๋ด๊ฐ ์๋ ๊ฑฐ์ ๋ชจ๋ Go ๊ฐ๋ฐ์์๊ฒ ํผ๋์ ์ผ๊ธฐํ์ต๋๋ค.
์ข ๋ ์ฌ์ํ๊ณ ๋ฌธ์ฒด์ ์ธ ๋ฌธ์ ๋ ์ด์ try(actualThing())
์ ๋ช ์ค์ ์ฝ๋๊ฐ ๋ํ๋๋์ง ์ ๊ฐ์ค๋ฝ์ต๋๋ค. try()
๋ก ๋ํ๋ ์ฝ๋๋ฒ ์ด์ค์์ ๋๋ถ๋ถ์ ๋ผ์ธ์ ๋ณด๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๋ถํํ๊ฒ ๋๊ปด์ง๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ์กฐ์ ์ผ๋ก ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)
check()
๋ try()
์ ๋งค์ฐ ์ ์ฌํ๊ฒ ๋์ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํจ์ ๋ฐํ ๊ฐ์ ์ ๋ฌํ๋ ๋์์ ์ญ์ ํ๊ณ ๋์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ ํ โโ๋ฐํ์ ์ ๋ฐํ ๊ฒ์
๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด try()
์ ๋ง์ ์ด์ ์ด ์ ์ง๋ฉ๋๋ค.
errors.Wrap(err, "context message")
์ ๊ฐ์ ์ค๋ฅ ๋ํ์ ์ํ ํ์ฌ ์ ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ์นํฉ๋๋ค.a, b, err := myFunc()
๋ผ์ธ์ ์์ฉ๊ตฌ๊ฐ ์์ต๋๋ค.defer fmt.HandleError(&err, "msg")
๋ก ์ค๋ฅ๋ฅผ ์ค๋ช
ํ๋ ๊ฒ์ ์ฌ์ ํ โโ๊ฐ๋ฅํ์ง๋ง ๊ถ์ฅํ ํ์๋ ์์ต๋๋ค.check
์ ์๋ช
์ ๋ํํ๋ ํจ์์์ ์์์ ์์ ์ธ์๋ฅผ ๋ฐํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋ ๊ฐ๋จํฉ๋๋ค.@s4n-gt ์ด ๋งํฌ๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ชจ๋ฅด๊ณ ์์๋ค.
@๊ตฟ์์ธํฌ์ธํธ ๋ํ
. ๋ ์ง์ ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ์ง์์ ์ ๊ณตํ์ง ์๋ ์ด์ ๋ ๋์์ธ ๋ฌธ์์์ ์์ธํ ์ค๋ช
ํฉ๋๋ค. (์๋
Gophercon์์ ๋์์ธ ์ด์์ด ๋ฐํ๋ ์ดํ) 1๋
์ ๋ ๋์ ๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์
์ด ๋์ค์ง ์์ ๊ฒ๋ ์ฌ์ค์
๋๋ค. ์ด๊ฒ์ด ์ด ์ ์์ด ์๋์ ์ผ๋ก ์ด๊ฒ์ ์๋ตํ๋ ์ด์ ์
๋๋ค(๋์ defer
์ฌ์ฉ์ ์ ์ํจ). ์ด ์ ์์ ์ฌ์ ํ โโ๊ทธ ์ ์์ ํฅํ ๊ฐ์ ์ ์ํ ๋ฌธ์ ์ด์ด ๋ก๋๋ค.
์ ์์๋ ํ
์คํธ ๋ฐ ๋ฒค์น๋งํฌ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋๋ก ํจํค์ง ํ
์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ธ๊ธํฉ๋๋ค. "์ ๋นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๊ฒฝ"์ ์๋์ง๋ง func main() error
๋ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํจ์ฌ ๋ ๋ฉ์ง๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ์๋ฏธ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func main() {
if err := newmain(); err != nil {
println(err.Error())
os.Exit(1)
}
}
๋ง์ง๋ง์ผ๋ก ํ ๊ฐ์ง ๋นํ. ์ค์ ๋ก ์ ์ ์์ฒด์ ๋ํ ๋นํ์ด ์๋๋ผ "ํ๋ฆ์ ์ ์ดํ๋ โโ๊ธฐ๋ฅ" ๋ฐ๋ก ์ ๋ํ ์ผ๋ฐ์ ์ธ ์๋ต์ ๋ํ ๋นํ์ ๋๋ค.
"๊ธฐ๋ฅ์ด ํ๋ฆ์ ์ ์ดํ๋ โโ๊ฒ์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค"์ ๋ํ ์๋ต์ " panic
๋ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ์ ์ดํฉ๋๋ค!"์
๋๋ค. ๊ทธ๋ฌ๋ try
์ ์ ์ฉ๋์ง ์๋ panic
์ด ์์
์ ์ํํ๋ ๊ฒ์ด ๋ ๊ด์ฐฎ์ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
panic
๋ ์ง๊ด์ ์ด๊ณ ์คํ์ ๊ณ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ณด์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์น์ํฉ๋๋ค. panic
๊ฐ ๋ฌด์์ ํ๋์ง ์ดํดํ๊ธฐ ์ํด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ฐพ์๋ณผ ํ์์กฐ์ฐจ ์์ต๋๋ค. ์ด๋ณด์ ํ๋ก๊ทธ๋๋จธ๋ recover
์ ๋ํด ๊ฑฑ์ ํ ํ์์กฐ์ฐจ ์์ต๋๋ค. ์๋ํ๋ฉด ์ด๋ณด์๋ ์ผ๋ฐ์ ์ผ๋ก ํจ๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌ์ถํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ ์ฒ์๋ถํฐ ํจ๋์ ํผํ๋ ๊ฒ๋ณด๋ค ๊ฑฐ์ ํญ์ ์ ๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
panic
๋ ๋ณด๊ธฐ ์ฌ์ด ์ด๋ฆ์
๋๋ค. ๊ทธ๊ฒ์ ๊ฑฑ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค. ์ฝ๋๋ฒ ์ด์ค์์ panic
๋ฅผ ๋ณธ ์ฌ๋์ ์ฌ์ํ ๊ฒ์ด๋ผ๋ ํจ๋์ _ํผํ๋_ ๋ฐฉ๋ฒ์ ์ฆ์ ์๊ฐํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง ํฌ์ธํธ๋ฅผ ํผ๊ธฐ๋ฐฑํ๋ฉด panic
๋ ํธ์ถ์ ์ค์ฒฉ๋ ์ ์์ผ๋ฏ๋ก ๋ณด๊ธฐ๊ฐ ํจ์ฌ ์ฝ์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ์ ์ดํ๋ โโํจ๋์ ๋งค์ฐ ์ฐพ๊ธฐ ์ฝ๊ณ ๊ทธ๊ฒ์ด ํ๋ ์ผ์ ๋ํด ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
try
ํจ์๋ ์ด๋ฌํ ์ ์ค ์ด๋ ๊ฒ๋ ์ถฉ์กฑํ์ง ์์ต๋๋ค.
๋ฌธ์๋ฅผ ์ฐพ์๋ณด์ง ์๊ณ ๋ try
๊ฐ ๋ฌด์์ ํ๋์ง ์ถ์ธกํ ์ ์์ต๋๋ค. ๋ง์ ์ธ์ด์์ ํค์๋๋ฅผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก Go์์ ์ด ํค์๋๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
try
๋ ํนํ ํจ์์ผ ๋ ๋์ ๋์ง ์์ต๋๋ค. _ํนํ_ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๊ฐ ์ด๋ฅผ ํจ์๋ก ๊ฐ์กฐํ ๋. _ESPECIALLY_ Java์ ๊ฐ์ ์ธ์ด๋ก ๊ฐ๋ฐํ ํ try
๋ ๋ถํ์ํ ์์ฉ๊ตฌ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค(ํ์ธ๋ ์์ธ ๋๋ฌธ์).
try
๋ ์ด์ ์ฃผ์ proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1]))))
์ ์์ ๋ฐ๋ผ ํจ์ ํธ์ถ์ ๋ํ ์ธ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฐ๊ฒฌํ๊ธฐ๊ฐ ๋์ฑ ์ด๋ ค์์ง๋๋ค.
๋ด ๋์ ๋ด๊ฐ ํน๋ณํ ์ฐพ๊ณ ์๋ ๊ฒฝ์ฐ์๋ try
๊ธฐ๋ฅ์ ๋ฌด์ํฉ๋๋ค. ๋ด ๋์ ๊ทธ๋ค์ ๋ณผ ๊ฒ์ด์ง๋ง ์ฆ์ os.FindProcess
๋๋ strconv.Atoi
ํธ์ถ๋ก ๊ฑด๋๋๋๋ค. try
๋ ์กฐ๊ฑด๋ถ ๋ฐํ์
๋๋ค. ์ ์ด ํ๋ฆ๊ณผ ๋ฐํ์ ๋ชจ๋ Go์ ๋ฐ์นจ๋์์ ์ ์ง๋ฉ๋๋ค. ํจ์ ๋ด์ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ๋ค์ฌ์ฐ๊ธฐ๋๊ณ ๋ชจ๋ ๋ฐํ์ return
๋ก ์์ํฉ๋๋ค. ์ด ๋ ๊ฐ์ง ๊ฐ๋
์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋์น๊ธฐ ์ฌ์ด ํจ์ ํธ์ถ๋ก ๋ง๋๋ ๊ฒ์ ์ฝ๊ฐ ๊ธฐ๋ถ์ด ๋์ฉ๋๋ค.
์ด ์๊ฒฌ๊ณผ ๋์ ๋ง์ง๋ง ์๊ฒฌ์ ์ด ์์ด๋์ด์ ๋ํ ๋์ ์ ์ผํ ์ง์ ํ ๋นํ์ ๋๋ค. ์ด ์ ์์ด ๋ง์์ ๋ค์ง ์๋๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง, ์ฌ์ ํ ๋ฐ๋ ์ ์ฒด์ ์น๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ์๋ฃจ์ ์ ์ฌ์ ํ โโ๋ค๋ฅธ ์๋ฃจ์ ๋ณด๋ค Go์ ๋น์ทํฉ๋๋ค. ์ด๊ฒ์ด ์ถ๊ฐ๋๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๊ฐ์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@buchanae ํฅ๋ฏธ๋กญ๋ค์. ๊ทธ๋ฌ๋ ์์ฑ๋ ๋๋ก fmt ์คํ์ผ ํ์์ ํจํค์ง์์ ์ธ์ด ์์ฒด๋ก ์ด๋ํ์ฌ ์์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
๊ทธ๋ฌ๋ ์์ฑ๋ ๋๋ก fmt ์คํ์ผ ํ์์ ํจํค์ง์์ ์ธ์ด ์์ฒด๋ก ์ด๋ํ์ฌ ์์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
์ข์ ์ง์ . ๋ ๊ฐ๋จํ ์:
a, b, err := myFunc()
check(err, "calling myFunc")
@buchanae ์ฐ๋ฆฌ๋ ๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ try
์ ๋ณด๋ค ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ต๋๋ค. ์์ธํ ์ค๊ณ ๋ฌธ์ , ํนํ ์ค๊ณ ๋ฐ๋ณต ์น์
์ ์ฐธ์กฐํ์ญ์์ค. check
์ ๋ํ ๊ทํ์ ํน์ ์ ์์ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ ๊ฒฝ์ฐ API์ ๊ฐ์ fmt.Errorf
( check
์ ์ผ๋ถ๋ก)์ ๊ฐ์ ๊ฒ์ ํตํด ์ค๋ฅ๋ฅผ ๋ณด๊ฐํ๋ ๊ฒ๋ง ํ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋๋ค์ ์ค๋ฅ ๋ฌธ์์ด์ ํตํด ์๋ ํญ๋ชฉ์ ์ฐธ์กฐํ๋ ์ ํญ๋ชฉ์ ๋ง๋๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๊ฐ ์๋ ๋ชจ๋ ์ข
๋ฅ์ ์์
์ ์ํํ๋ ค๊ณ ํ ์ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ด ์ ์์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ํฉ์ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ try
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์ ์ ํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
a, b, c, ... err := try(someFunctionCall())
if err != nil {
return ..., err
}
์ด๋ ๊ฒ ์๊ธด ์ฝ๋๊ฐ ์์ฒญ๋๊ฒ ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ์ด ๋ณด์ด๋ ๋ชจ๋ ์ฝ๋์ ๋ ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ defer
๊ฐ ์ณ์ง ์์ ๊ฒฝ์ฐ์๋ if
๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ด ์ค์ ๋ฐ๋ฅด์ง ์๋๋ค:
defer fmt.HandleErrorf(&err, โfoobarโ)
์ด๋ ํ๋ก์ด์ ์ธ๋ฐ์ด๋ ์ค๋ฅ๋ฅผ ๋จ์ด๋จ๋ฆฌ๋๋ฐ, ์ด๋ ์ด๋ก์ ์ธ ์ผ์ ๋๋ค. ์ด๋ฐ์์ผ๋ก ๋ ์ฐ๋ผ๋ ๊ฑด๊ฐ์?
defer fmt.HandleErrorf(&err, โfoobar: %vโ, err)
err์ ์ค๋ณต์ ์ฝ๊ฐ ๋ง๋๋ฌ์ ๋๋ค. ์ด๊ฒ์ ์ ์์์ ์ง์ ์ ์ผ๋ก ๋ถํฉํ๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์์ ๋ํ ๋ถ์์ ์ธ ์๊ฒฌ์ผ ๋ฟ์ ๋๋ค.
@buchanae ๊ฐ ์ ๊ธฐํ ๋ ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ ๊ณต์ ํฉ๋๋ค. ๋ช ๋ช ๋ ๋ฐํ ๋ฐ ์ปจํ ์คํธ ์ค๋ฅ์ ๋๋ค.
๋๋ ๋ช ๋ช ๋ ๋ฐํ์ด ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ด ๋ฌธ์ํ๋ก์๋ง ์ ๋ง๋ก ์ ์ตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์๊ฒ ๋ ๋ง์ด ๊ธฐ๋๋ ๊ฒ์ ๊ฑฑ์ ์ ๋๋ค. ๋๋ฌด ๋ชจํธํด์ ์ฃ์กํฉ๋๋ค. ์ด๊ฒ์ ๋ํด ๋ ์๊ฐํ๊ณ ์ข ๋ ๊ตฌ์ฒด์ ์ธ ์๊ฐ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
์ฌ๋๋ค์ด try
๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๊ตฌ์กฐํํ์ฌ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์ด๋ผ๋ ์ค์ง์ ์ธ ์ฐ๋ ค๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ณต์ ์ค๋ฅ ๋ํ ๊ธฐ๋ฅ์ ํตํด ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ง๊ธ์ ์ด๊ฒ์ ์๊ฐํ๊ธฐ์ ํนํ ์ด์ํ ์๊ธฐ์
๋๋ค.
try
์ ์๋ ๋๋ก ์ผ๋ถ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ๋ฉ์ง๊ฒ ๋ง๋ญ๋๋ค. ๋ค์์ ํ์ฌ ํ๋ก์ ํธ์ ์ฝ๋ ๊ธฐ๋ฐ์์ ์์๋ก ์ ํํ ํจ์์ด๋ฉฐ ์ผ๋ถ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค. ํนํ ๊ตฌ์กฐ์ฒด ํ๋์ ํ ๋นํ ๋ try
๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๊น์ ์ธ์์ ๋ฐ์์ต๋๋ค. (๊ทธ๊ฒ์ ์ ์์ ๋ํ ๋์ ์ฝ๊ธฐ๊ฐ ์ ํํ๊ณ ์ด๊ฒ์ด ํจ๊ณผ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๊น?)
๊ธฐ์กด ์ฝ๋:
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
err := dbfile.RunMigrations(db, dbMigrations)
if err != nil {
return nil, err
}
t := &Thing{
thingy: thingy,
}
t.scanner, err = newScanner(thingy, db, client)
if err != nil {
return nil, err
}
t.initOtherThing()
return t, nil
}
try
์ฌ์ฉ:
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
try(dbfile.RunMigrations(db, dbMigrations))
t := &Thing{
thingy: thingy,
scanner: try(newScanner(thingy, db, client)),
}
t.initOtherThing()
return t, nil
}
newScanner
๊ฐ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋ช
ํํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๊ฐ๋
์ฑ ์์ค์ ์์ต๋๋ค. ํ์ง๋ง try
๊ฐ ์๋ ์ธ์์์ Go ํ๋ก๊ทธ๋๋จธ๋ ๊ทธ ์กด์ฌ์ ๋ ๋ฏผ๊ฐํ ๊ฒ์
๋๋ค.
@josharian main
๋ฐํ error
๊ด๋ จ : ๊ทํ์ ์์ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ด ๋์ผํ ํจ๊ณผ๋ฅผ ์ป๋ ๋ฐ ํ์ํ ์ ๋ถ์ธ ๊ฒ ๊ฐ์ต๋๋ค. main
์ ์๋ช
์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ ๋นํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
"foobar" ์์ ๊ดํ์ฌ: ๊ทธ๊ฒ์ ๋จ์ง ๋์ ์์ผ ๋ฟ์ ๋๋ค. ์๋ง ๋ฐ๊ฟ์ผ๊ฒ ๋ค์. ์ฌ๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
defer fmt.HandleErrorf(&err, โfoobar: %vโ, err)
์ค์ ๋ก err
๊ฐ ๋๋ฌด ์ผ์ฐ ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ณ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ทธ ์ค ์ด๋ ๊ฒ๋ ์๋์ (๊ฒฐํจ์ด ์๋ค๊ณ ์๊ฐํ๋) HandleErrorf๋งํผ ๊นจ๋ํ์ง ์์ต๋๋ค. ์ข ๋ ํ์ค์ ์ธ ์์ ๋ฅผ ๊ฐ์ง๊ณ ํฌํผ ํจ์๋ฅผ โโ๋ ๊ฐ์ฏค ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
ํธ์ง: ์ด ์ด๊ธฐ ํ๊ฐ ๋ฒ๊ทธ๋ ์์ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ๋ถ๋ถ:
defer fmt.HandleErrorf(&err, "copy %s %s: %v", src, dst, err)
@adg ์, try
๋ ์์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ๊ทํ์ ์๊ฒฌ์ ๋ค์: ๋ช
๋ช
๋ ๋ฐํ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
์ฌ๋๋ค์ ์ค๋ฅ ๋ฌธ์์ด์ ํตํด ์๋ณธ์ ์ฐธ์กฐํ๋ ์ ํญ๋ชฉ์ ๋ง๋๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๊ฐ ์๋ ๋ชจ๋ ์ข ๋ฅ์ ์์ ์ ์ํํ๋ ค๊ณ ํ ์ ์์ต๋๋ค.
try
๋ ์ฌ๋๋ค์ด ์ค๋ฅ๋ก ํ๊ณ ์ถ์ดํ๋ ๋ชจ๋ ์ข
๋ฅ์ ์ผ์ ์ฒ๋ฆฌํ๋ ค๊ณ ์๋ํ์ง ์๊ณ ์๋นํ ๋จ์ํ๊ฒ ๋ง๋๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์๋ ๊ฒ๋ง ์ฒ๋ฆฌํฉ๋๋ค. ๋ด check
์์ ๊ฐ ๊ฐ์ ์ค์ ๊ฑท๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ์ถ์ ์ ์ถ๊ฐํ๋ ์ฝ๋์ด๋ฉฐ ๋๋ก๋ ์ปจํ ์คํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ๋๋ ๊ทธ ์คํ ์ถ์ ์ด ๋๋ฒ๊น ์ ๋งค์ฐ ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ํตํด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ ์์ด ๋ชจ๋ ์ค๋ฅ์ ์คํ ์ถ์ ์ ์ถ๊ฐํ ์ ์์ต๋๊น? ๋๋ ๊ธธ์ ์์๋ค.
@adg ๊ฐ ์ ๊ณตํ ์์์ ๋ ๊ฐ์ง ์ ์ฌ์ ์ธ ์คํจ๊ฐ ์์ง๋ง ์ปจํ
์คํธ๋ ์์ต๋๋ค. newScanner
๋ฐ RunMigrations
์์ฒด๊ฐ ์ด๋ค ๊ฒ์ด ์๋ชป๋์๋์ง ๋จ์๊ฐ ๋๋ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์ถ์ธก์ ๋จ์ต๋๋ค.
@adg ๊ฐ ์ ๊ณตํ ์์์ ๋ ๊ฐ์ง ์ ์ฌ์ ์ธ ์คํจ๊ฐ ์์ง๋ง ์ปจํ ์คํธ๋ ์์ต๋๋ค. newScanner ๋ฐ RunMigrations๊ฐ ์ด๋ค ๊ฒ์ด ์๋ชป๋์๋์ง ์๋ ค์ฃผ๋ ๋ฉ์์ง๋ฅผ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ์ง ์์ผ๋ฉด ์ถ์ธกํ ์ ์์ต๋๋ค.
๋ง์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ด ํน์ ์ฝ๋์์ ์ ํํ ๋์์ธ์ ๋๋ค. ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ค๋ฅ๋ฅผ ๋ง์ด ๋ํํฉ๋๋ค.
๋๋ฒ๊น
์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ค๋ ์ฐ๋ ค๋ฅผ @deanveloper ๋ฐ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ์ ํํ ์ ์๋ ๊ฒ์ ์ฌ์ค์ด์ง๋ง ์ 3์ ์ข
์์ฑ์ ์คํ์ผ์ ์ฐ๋ฆฌ๊ฐ ํต์ ํ ์ ์์ต๋๋ค.
๋ ๋ฐ๋ณต์ ์ธ if err := ... { return err }
๊ฐ ๊ธฐ๋ณธ ํฌ์ธํธ๋ผ๋ฉด https://github.com/golang/go/issues/27794 ๊ฐ ์ ์ํ ๊ฒ์ฒ๋ผ "์กฐ๊ฑด๋ถ ๋ฐํ"์ผ๋ก ์ถฉ๋ถํ ์ง ๊ถ๊ธํฉ๋๋ค.
return nil, err if f, err := os.Open(...)
return nil, err if _, err := os.Write(...)
๋๋ ?
๊ฐ try
๋ณด๋ค ๋ ์ ํฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ํญ์ ์ค๋ฅ์ ๋ํด defer
๋ฅผ ์ถ์ ํด์ผ ํ๋ ๊ฒ๋ ๊น๋ค๋ก์ธ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ๋ํ try/catch
๋ฅผ ์์ํ ์ฌ์ฉํ๋ ์์ธ์ ๋ํ ๊ฒ์ดํธ๋ฅผ ๋ซ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ์์ํ try/catch๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ดํธ๋ฅผ ๋ซ์ต๋๋ค.
๋๋ ์ด๊ฒ์ผ๋ก _๋_ ์ด์์ ๋๋ค.
์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์์์ ์ ๊ธฐํ ๋ช ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ ๋์ํฉ๋๋ค. ๋๋ ์ฒ์ฒํ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ์์ ํญ์ ์ปจํ ์คํธ๋ก ์ฅ์ํ ๋ค์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ ํํ๋ ค๊ณ ํฉ๋๋ค. ์ด ์ ์์ ์ฌ์ฉํ๋ฉด ๋ช ๋ช ๋ ๋ฐํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ํจ์๋ฅผ ์์ ํ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค(๋ค์ดํค๋ ๋ฐํ์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค).
@griesemer ๊ฐ ๋งํ๋ฏ์ด :
๋ค์ ๋งํ์ง๋ง, ์ด ์ ์์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ํฉ์ ํด๊ฒฐํ๋ ค๊ณ ์๋ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ try๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์ ์ ํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
a, b, c, ... err := try(someFunctionCall())
์ค๋ฅ != nil {
๋ฐํ ..., ์ค๋ฅ
}
์ด๋ ๊ฒ ์๊ธด ์ฝ๋๊ฐ ์์ฒญ๋๊ฒ ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ์ด ๋ณด์ด๋ ๋ชจ๋ ์ฝ๋์ ๋ ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ์๋๋๋ค. defer๊ฐ ์ณ์ง ์์ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์, ํ์ง๋ง ์ข์ง ์์์ผ ํฉ๋๋ค. ๊ด์ฉ์ ์ฝ๋๋ ํญ์ ์ค๋ฅ๋ฅผ ๋ํ/์ฅ์ํฉ๋๊น? ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ stdlib์ ์ปจํ ์คํธ/๋ฉ ์ค๋ฅ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ธ๋ จ๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋์ ํ๋ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๋ณด๊ธฐ์ ์ด ์ ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ง์ ๊ณ ๋ คํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒ๋ค๊ฐ, ์ด ์ ์์ ์ง์ฐ ํธ์ถ๊ณผ ํจ๊ป ๋ช ๋ช ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ _๋จ์ผ ์ฅ์_์์ ๊ฐ๋ฅํ ์ฌ๋ฌ ์ค๋ฅ ๋ฐํ ์ฌ์ดํธ๋ฅผ ๋ํ/์ฅ์ํ๋ ๊ฒฝ์ฐ์๋ง ํด๊ฒฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋จ์ผ ํจ์์ ๋ค๋ฅธ ์ค๋ฅ์ ๋ค๋ฅธ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, DB ์ค๋ฅ๋ฅผ ์ฅ์ํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค(์คํ ์ถ์ ์ด ์๋ค๊ณ ๊ฐ์ )
์ด๊ฒ์ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ค์ ์ฝ๋์ ์์ ๋๋ค.
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
if err != nil {
return err
}
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
if err != nil {
tx.Rollback()
return fmt.Errorf("insert table: %w", err)
}
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
if err != nil {
tx.Rollback()
return fmt.Errorf("insert table2: %w", err)
}
return tx.Commit()
}
์ ์์ ๋ฐ๋ฅด๋ฉด:
์ค๋ฅ ๋ณด๊ฐ ๋๋ ๋ํ์ด ํ์ํ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค. ๊ฒ์ฆ๋ if ๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋, ๋๋ defer ๋ฌธ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ "์ ์ธ"ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด "์ค๋ ฅ์ด ๊ฒ์ฆ๋ if ๋ฌธ์ ๊ณ ์ํ๋ค"์ ๋ฒ์ฃผ์ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ ์๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ ๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Go ํ์ด ์ ๋ค๋ฆญ์ ์ฐ์ ์์ ๋ฅผ ์ ํ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ์ ์ํฉ๋๋ค. Go ํ์ด ๊ฐ์ฅ ๋ง์ ๋นํ์ ๋ฃ๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์
๋๋ค. ์ค๋๋ ์ ๊ธฐ์ ์ ๊ทธ๋ ๊ฒ ๊ณ ํต์ค๋ฝ์ง ์์ต๋๋ค( go fmt
๋ ํ ์ค์ ์์ด์ผ ํฉ๋๋ค).
try()
๊ฐ๋
์๋ ์ฒดํฌ/ํธ๋ค์์ check
์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ์ Go์ฒ๋ผ ์ฝ์ง ์์ต๋๋ค. ์ฌ๋๋ค์ Go์ฒ๋ผ ๋ณด์ด๋ ํ์ nil ํ
์คํธ ์์ด ํ ๋น ๊ตฌ๋ฌธ์ ์ํฉ๋๋ค. ํ์ธ/์ฒ๋ฆฌ์ ๋ํ 13๊ฐ์ ๊ฐ๋ณ ์๋ต ์ด ์ด๋ฅผ ์ ์ํ์ต๋๋ค. ์ฌ๊ธฐ์์ _๋ฐ๋ณต ํ
๋ง_๋ฅผ ์ฐธ์กฐํ์ธ์.
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes
f, # := os.Open(...) // return on error
f, #panic := os.Open(...) // panic on error
f, #hname := os.Open(...) // invoke named handler on error
// # is any available symbol or unambiguous pair
์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์ ํธ์ถ์ ์ค์ฒฉ์ ์์
์์๋ฅผ ๋ชจํธํ๊ฒ ํ๊ณ ๋๋ฒ๊น
์ ๋ฐฉํดํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋์ ์ํ์ ํธ์ถ ์์๊ฐ ๋ช
ํํด์ผ ํ์ง๋ง ์ฌ๊ธฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
try(step4(try(step1()), try(step3(try(step2())))))
์ด์ ์ธ์ด๊ฐ ๋ค์์ ๊ธ์งํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.
f(t ? a : b)
๋ฐ f(a++)
์ปจํ ์คํธ ์์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ํ์ธ/์ฒ๋ฆฌ์ ์ฃผ์ ๊ทผ๊ฑฐ๋ ์ํฉํ๋ฅผ ์ฅ๋ คํ๋ ๊ฒ์ ๋๋ค.
error
์ ํ๊ณผ ๋ง์ง๋ง ๋ฐํ ๊ฐ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์์ธ ์ํ์ ๋ํ ๋ค๋ฅธ ๋ฐํ ๊ฐ/์ ํ์ ๊ฒ์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ if errno := f(); errno != 0 { ... }
๋ก ๋์๊ฐ๋๋ค.
์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ์คํ ๋ฆฌ์ง ๋๋ ๋คํธ์ํน API๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ์๋ชป๋ ์
๋ ฅ์ด๋ ์๊ธฐ์น ์์ ๋ด๋ถ ์ํ๋ก ์ธํ ์ค๋ฅ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. ๋ด ์ฝ๋๋ ๋ค์ ์ค ํ๋๋ฅผ return err
๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ์ํํฉ๋๋ค.
@gopherbot ์ Go2, LanguageChange ์ถ๊ฐ
?
๋ง ์ฌ์ฉํ์ฌ rust
์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ํํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
try() ํธ์ถ์ ๋ํด ํ์์ ์ธ ์ด์ ๋ ๋ ๊ฐ์ง ์์์ ๋ฐ์ธ๋ฉ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๋ฐํ ๊ฐ ์ค๋ฅ์ ๋ํ ๋ฐ์ธ๋ฉ๊ณผ try()์ ๋ํ ์ธ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค. try()์ ๋ํด ๋ฐํ ๊ฐ์ ์ค๋ฅ๊ฐ ์๋ ์ธ์ ํจ์์ ํจ๊ป try()๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ ๊ฐ์ ๋ํ ๋ฐ์ธ๋ฉ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ์ด ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ์ดํดํ๋ ค๋ฉด ๋ ๋ง์ ํํ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
func doSomething() (int, %error) {
f := try(foo())
...
}
%error
๊ฐ ์์ผ๋ฉด try()๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.๊ธฐ์กด ๊ตฌ๋ฌธ์ ์๋ก์ด ์๊ตฌ ์ฌํญ/๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค.
์์งํ ๋งํด์ foo()์๋ %error๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ท์น 1๊ฐ ์ถ๊ฐ
์ธ๋ถ ์ค๊ณ ๋ฌธ์์์ ์ด์ ๋ฐ๋ณต์์ try ๋ด์ฅ ํจ์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๋ฌํ๋๋ก ์ ์๋์์์ ์์์ต๋๋ค. ์ด์ ๊ฐ์ด:
handler := func(err error) error {
return fmt.Errorf("foo failed: %v", err) // wrap error
}
f := try(os.Open(filename), handler)
๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ์ข์ต๋๋ค.
f := try(os.Open(filename), func(err error) error {
return fmt.Errorf("foo failed: %v", err) // wrap error
})
๋ฌธ์์ ๋์ ์๋ ๊ฒ์ฒ๋ผ ์ด๋ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ์ ๊ธฐํ์ง๋ง ์ด๋ฌํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ด๋ ํด๋ก์ ๋ฅผ ์ ํ์ ์ผ๋ก ์ง์ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ ์งํ๋ค๋ฉด ์ด ์ ์์ด ํจ์ฌ ๋ ๋ฐ๋์งํ๊ณ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ ๋ฒ์งธ๋ก, ๋ด์ฅ ํจ์๊ฐ ๋ฐํ๋๋๋ก ํ ์ ์๋ค๋ ์ ์ ์ ๊ฒฝ์ฐ์ง ์์ง๋ง, ์ฝ๊ฐ์ ๋ฐ์ดํฌ์ธํ
์ ์ํด 'try'๋ผ๋ ์ด๋ฆ์ด ๋ฐํ์ ์ ๋ฐํ ์ ์๋ค๊ณ ์ ์ํ๊ธฐ์๋ ๋๋ฌด ์งง์ต๋๋ค. ๋ฐ๋ผ์ attempt
์ ๊ฐ์ด ๋ ๊ธด ์ด๋ฆ์ด ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค.
ํธ์ง: ์ ์งธ, ์ด์์ ์ผ๋ก๋ go ์ธ์ด๊ฐ ๋จผ์ ์ ๋ค๋ฆญ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ ์ด try ํจ์๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๊ตฌํํ๋ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ฉฐ, ๋ฐ๋ผ์ bikeshedding์ด ๋๋ ์ ์๊ณ ๋ชจ๋ ์ฌ๋์ด ์์ ์ด ์ ํธํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Hacker ๋ด์ค์๋ ๋ช ๊ฐ์ง ์์ ์ด ์์ต๋๋ค. try
๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ์๋ํ์ง ์์ผ๋ฏ๋ก(๋ฐํ๋ ์ ์์) ํจ์์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. return
๋๋ defer
๊ตฌ๋ฌธ์ด ๋ ์ ํฉํฉ๋๋ค.
func CopyFile(src, dst string) (err error) {
r := try os.Open(src)
defer r.Close()
w := try os.Create(dst)
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a โtryโ fails
}
}()
try io.Copy(w, r)
try w.Close()
return nil
}
@sheerun ์ด์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ฐ๋ก ์ panic
๊ฐ ๋ด์ฅ ํจ์๋ฅผ ๋ณ๊ฒฝํ๋ ์ ์ด ํ๋ฆ๋ ์๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ ๋์ํ์ง ์์ง๋ง ๊ทธ๊ฒ์ ๋ง์ต๋๋ค.
panic(...)
๋ return
๊ฐ ํจ์์์ ๋๊ฐ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ท์น์ ๋ํ ๋น๊ต์ ๋ช
ํํ ์์ธ์
๋๋ค(๋ง์ฅ๋์ด ์๋). ๋๋ ์ฐ๋ฆฌ๊ฐ ์ธ ๋ฒ์งธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ ๋นํ๋ก ๊ทธ๊ฒ์ ์กด์ฌ๋ฅผ ์ด์ฉํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.์ด ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ tryf
์ ๊ฐ์ ์ ํ์ ์ฆ๋ ๊ธฐ๋ฅ์ด ์๋ ๋ณํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
func tryf(t1 T1, t1 T2, โฆ tn Tn, te error, fn func(error) error) (T1, T2, โฆ Tn)
์ด๊ฒ์ ๋ฒ์ญ
x1, x2, โฆ xn = tryf(f(), func(err error) { return fmt.Errorf("foobar: %q", err) })
์ด๊ฒ์ผ๋ก
t1, โฆ tn, te := f()
if te != nil {
if fn != nil {
te = fn(te)
}
err = te
return
}
์ด๊ฒ์ ๋ช
์์ ์ธ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ( try
๋ฅผ ์ฌ์ฉํ๋ ๋์ ) ์ฐ๋ฆฌ๋ ์ด ๋์์ธ์ ์ด์ ๋ฒ์ ์์ ์ง๋ฌธ์ ๋ํ ํฉ๋ฆฌ์ ์ธ ๋ต๋ณ์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ๋ฅ ๋ณด๊ฐ์ด nil์ด๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
try
๊ฐ ๊ธฐ์กด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฒดํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค๋ฅ ๊ฒฝ๋ก์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ์ด๋ ค์์ง๊น ๊ฑฑ์ ๋ฉ๋๋ค.
๋ฉ์์ง๋ฅผ ๊ธฐ๋กํ๊ณ ์๊ฒฉ ์ธก์ ์นด์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ try
๋ชจ๋ ๊ฒ์ ๊ธฐ๋ํ๋ ๋ฆฐํฐ์ ๊ฐ๋ฐ์ ๋ชจ๋์๊ฒ ๊ฒฐํจ์ด ์๊ฑฐ๋ ๋ถ์ ์ ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
a, b, err := doWork()
if err != nil {
updateCounters()
writeLogs()
return err
}
Go๋ ๋๊ตฌ(fmt, lint ๋ฑ)์ ์ํด ์ํ๋๋ ์ผ๋ฐ์ ์ธ ๊ด์ฉ๊ตฌ๋ฅผ ๊ฐ์ง ๊ทน๋๋ก ์ฌํ์ ์ธ ์ธ์ด์ ๋๋ค. ์ด ์์ด๋์ด์ ์ฌํ์ ํ๊ธ ํจ๊ณผ๋ฅผ ์ผ๋์ ๋์ญ์์ค. ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝํฅ์ด ์์ ๊ฒ์ ๋๋ค.
@politician , ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ฐพ๊ณ ๊ณ์ ๋จ์ด๋ _social_์ด ์๋๋ผ _opinionated_์ ๋๋ค. Go๋ ๋ ์ฐฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ๋๋จธ์ง๋ ๋๋ถ๋ถ ๋น์ ์ด ๋ฌด์์ ์ป๊ณ ์๋์ง์ ๋์ํฉ๋๋ค.
@beoran Godep๊ณผ ๊ฐ์ ์ปค๋ฎค๋ํฐ ๋๊ตฌ์ ๋ค์ํ ๋ฆฐํฐ๋ ๋ฐ๋์ด ๋
๋จ์ ์ด๋ฉด์ ์ฌ๊ต์ ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ง์ ๋๋ผ๋ง๋ ์ด๋ฌํ ์กฐํฉ์์ ๋น๋กฏ๋ฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋, ์ฐ๋ฆฌ ๋ ๋ค try
๊ฐ ๋ค์ ๋๋ผ๋ง๊ฐ ๋์ด์๋ ์ ๋๋ค๋ ๋ฐ ๋์ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@politician ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ ๊ฒ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋๋ผ๋ง๋ฅผ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํ๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ํด ํผ๋์ค๋ฌ์ํ๋ค.
๋ธ๋ก๊ทธ์์: Errors are values โโ, ๋ด ๊ด์ ์์ ์ด๊ฒ์ ๋ฌด์๋์ง ์๋ ๊ฐ์น๋ฅผ ๊ฐ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ Rop Pike๊ฐ "๊ฐ์ ํ๋ก๊ทธ๋๋ฐ๋ ์ ์๊ณ ์ค๋ฅ๋ ๊ฐ์ด๋ฏ๋ก ์ค๋ฅ๋ ํ๋ก๊ทธ๋๋ฐ๋ ์ ์์ต๋๋ค"๋ผ๊ณ ๋งํ ๊ฒ์ ๋ฏฟ์ต๋๋ค.
์ฐ๋ฆฌ๋ error
๋ฅผ exception
๋ก ๊ฐ์ฃผํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์๊ฐ๋ฟ๋ง ์๋๋ผ ์ฝ๋ฉ์๋ ๋ณต์ก์ฑ์ ๊ฐ์ ธ์ค๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
"์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ์ญ์์ค." -- ๋กญ ํ์ดํฌ
๋ํ ์ด ์ฌ๋ผ์ด๋ ๋ฅผ ๊ฒํ ํ ์ ์์ต๋๋ค.
if
๋ฅผ ํตํ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํนํ ์ด์ํ ํ ๊ฐ์ง ์ํฉ์ ํ์ผ์ ๋ซ์ ๋์
๋๋ค(์: NFS์์). ํ์ฌ .Close()
์์ ์ค๋ฅ ๋ฐํ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ค์์ ์์ฑํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
r, err := os.Open(src)
if err != nil {
return err
}
defer func() {
// maybe check whether a previous error occured?
return r.Close()
}()
defer try(r.Close())
์ด๋ฌํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ์ ๊ฐ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๊น? ์ ์ด๋ r.Close()
๋ฐ w.Close()
์ ์ค๋ฅ๋ฅผ ๋ฌด์ํ์ง ์๋๋ก ์ ์์์ CopyFile()
์์ ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@seehuhn ์ง์ฐ๋ ํจ์์ ๋ฐํ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
func doWork() (err error) {
r, err := os.Open(src)
if err != nil {
return err
}
defer func() {
err = r.Close() // overwrite the return value
}()
}
์์๋๋ก ์๋ํฉ๋๋ค. ํค๋ ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ๋๋ค.
๋๋ ๊ทธ ์ ์์ด ๋ง์์ ๋ค์ง๋ง @seehuhn ์ ์๋ ๋ค๋ฃจ์ด์ ธ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
defer try(w.Close())
์ค๋ฅ๊ฐ ์์ง ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ์๋ง Close()์์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
์์ฃผ์ฐ๋ ํจํด์ธ๋ฐ..
์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ฐ๋ ค์ ๋์ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํจ์ฌ ์น์ํ๊ณ ๋ช ํํ๊ฒ ์ ์งํ๊ณ ๋๋ฒ๊ทธ ํ๋ก์ธ์ค๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋ชจ๋ฒ ์ฌ๋ก ์ค ํ๋๋ก ๋ณด๊ณ ์์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ ์ฒซ ๋ฒ์งธ ์ผ์ fmt.HandleErrorf
๋ฅผ tryf
ํจ์๋ก ๋ฐ๊พธ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ํจ์๋ ์ค๋ฅ์ ์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ ๋์ฌ๋ก ๋ถ์์ต๋๋ค.
func tryf(t1 T1, t1 T2, โฆ tn Tn, te error, ts string) (T1, T2, โฆ Tn)
์๋ฅผ ๋ค์ด (๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ค์ ์ฝ๋์์):
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil {
return nil, errors.WithMessage(err, "load config dir")
}
b := bytes.NewBuffer(nil)
if err = templates.ExecuteTemplate(b, "main", c); err != nil {
return nil, errors.WithMessage(err, "execute main template")
}
buf, err := format.Source(b.Bytes())
if err != nil {
return nil, errors.WithMessage(err, "format main template")
}
target := fmt.Sprintf("%s.go", filename(pkgPath))
if err := ioutil.WriteFile(target, buf, 0644); err != nil {
return nil, errors.WithMessagef(err, "write file %s", target)
}
// ...
}
๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
func (c *Config) Build() error {
pkgPath := tryf(c.load(), "load config dir")
b := bytes.NewBuffer(nil)
tryf(emplates.ExecuteTemplate(b, "main", c), "execute main template")
buf := tryf(format.Source(b.Bytes()), "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
tryf(ioutil.WriteFile(target, buf, 0644), fmt.Sprintf("write file %s", target))
// ...
}
๋๋ @agnivade ์ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func (p *pgStore) DoWork() (err error) {
tx := tryf(p.handle.Begin(), "begin transaction")
defer func() {
if err != nil {
tx.Rollback()
}
}()
var res int64
tryf(tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res), "insert table")
_, = tryf(tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res), "insert table2")
return tryf(tx.Commit(), "commit transaction")
}
๊ทธ๋ฌ๋ @josharian ์ ์ด ์๋ฃจ์ ์ ๋ํด ์ฃผ์ ํ๊ฒ ๋ง๋๋ ์ข์ ์ ์ ์ ๊ธฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ฑ๋ ๋๋ก fmt ์คํ์ผ ํ์์ ํจํค์ง์์ ์ธ์ด ์์ฒด๋ก ์ด๋ํ์ฌ ์์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค.
์ ๋ ์ด ์ ์์ ์ ์ ์ผ๋ก ๋์ํ๋ฉฐ ์ฌ๋ฌ ์์์ ์ด์ ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์์์ ๋ํ ๋์ ์ ์ผํ ๊ด์ฌ์ฌ๋ try
์ ์ด๋ฆ ์ง์ ์
๋๋ค. ๋ค๋ฅธ ์ธ์ด์์ ํจ์ถ๋ ์๋ฏธ๊ฐ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ ๋ ๊ทธ ๋ชฉ์ ์ด ๋ฌด์์ธ์ง์ ๋ํ ๊ฐ๋ฐ์์ ์ธ์์ ์๊ณกํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฐ๋ ์ฌ๊ธฐ์ ์ฐพ์์ต๋๋ค.
์ ์๊ฒ๋ pass
๋ผ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ ํธํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ ์ ํํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฒฐ๊ตญ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ํธ์ถ์๊ฐ ์ฒ๋ฆฌํ๋๋ก ๋ค์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. try
๋ ์ค๋ฅ๊ฐ ์ฒ๋ฆฌ๋์๋ค๋ ์ธ์์ ์ค๋๋ค.
๊ทธ๊ฒ์ ์ฃผ๋ก ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ("์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์์ฉ๊ตฌ๋ฌธ")๊ฐ ๋จ์ํ ๋์๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ชจ๋ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ๋จ์ํ if err != nil { return err }
์ด๋ฉด ์ด์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ ์ถ๊ฐํ๋ ๋ฐ ์ฝ๊ฐ์ ๊ฐ์น๊ฐ ์์์ ์ ์ ์์ต๋๋ค(Go๋ ์ฑํฅ์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ์คํ์ด ์๋ ์ธ์ด์).
์ฌ์ค, nil์ด ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ด๊ฐ ํ๊ณ ์ถ์ ์ผ์ ์ํฉ๋ง๋ค ์๋นํ ๋ค๋ฆ
๋๋ค. ์๋ง๋ t.Fatal(err)
ํ๊ณ ์ถ์ต๋๋ค. ์๋ง๋ ์ฅ์ ๋ฉ์์ง return fmt.Sprintf("oh no: %v", err)
๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ์๋ง๋ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ณ ๊ณ์ํ ๊ฒ์
๋๋ค. SafeWriter ๊ฐ์ฒด์ ์ค๋ฅ ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ๊ณ์ ์งํํ๋ฉด์ ์ผ๋ถ ์์
์ํ์ค๊ฐ โโ๋๋ ๋ ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค. ๋ค๋ฅธ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ค ์ค ์ด๋ ๊ฒ๋ try
๋ก ์๋ํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ try
์ ๋ํ ์ธ์๊ฐ ๋ชจ๋ if err != nil
๋ธ๋ก์ ์ ๊ฑฐํ๋ค๋ ๊ฒ์ด๋ผ๋ฉด ํด๋น ์ธ์๋ ์ ํจํ์ง ์์ต๋๋ค.
๊ทธ ์ค _์ผ๋ถ_๊ฐ ์ ๊ฑฐ๋ฉ๋๊น? ํ์ ํ๋. ๊ทธ๊ฒ์ด ๋์๊ฒ ๋งค๋ ฅ์ ์ธ ์ ์์
๋๊น? ์. ๋๋ ์ ๋ง๋ก ๊ฑฑ์ ํ์ง ์๋๋ค. ๋์๊ฒ if err != nil
๋ ์ค๊ดํธ ๋๋ defer
์ ๊ฐ์ด Go์ ์ผ๋ถ์ผ ๋ฟ์
๋๋ค. Go๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ ์ด๊ฒ์ด ์ฅํฉํ๊ณ ๋ฐ๋ณต์ ์ผ๋ก ๋ณด์ผ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง, Go๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ธ์ด๋ฅผ ๊ทน์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ์ง ์์ต๋๋ค.
Go์ ๋ํ ์ค์ํ ๋ณ๊ฒฝ์ ๋ํ ๊ธฐ์ค์ ์ ํต์ ์ผ๋ก ์ ์๋ ๋ณ๊ฒฝ์ด (A) ์ค์ํ๊ณ , (B) ๋ง์ ์ฌ๋๋ค์๊ฒ ์ํฅ์ ๋ฏธ์น๊ณ , (C) ์ ์์ ์ํด ์ ํด๊ฒฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค๋ ๊ฒ์ด์์ต๋๋ค. ์ ๋ ์ด ์ธ ๊ฐ์ง ๊ธฐ์ค ์ค ์ด๋ ๊ฒ์๋ ํ์ ์ด ์์ต๋๋ค. ๋๋ Go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋ ๊ทธ๋๋ก ๋งค์ฐ ๋ง์กฑํฉ๋๋ค.
@peterbourgon ๋ฐ @deanveloper ๋ฅผ ์์ฝํ๊ธฐ ์ํด Go์์ ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ ์ค ํ๋๋ ์ฝ๋ ํ๋ฆ์ด ๋ช ํํ๊ณ panic()์ด Python์์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ค ํ๋ฆ ์ ์ด ๋ฉ์ปค๋์ฆ์ผ๋ก ์ทจ๊ธ ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
ํจ๋์ ๋ํ ๋
ผ์๊ณผ ๊ด๋ จํ์ฌ, panic()์ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ํญ์ ํ ์ค์ ๋จ๋
์ผ๋ก ๋ํ๋ฉ๋๋ค. fmt.Println(panic("oops"))
ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ์์ฑ์ ์์ฒญ๋๊ฒ ์ฆ๊ฐ์ํค๊ณ ์ฌ๋๋ค์ด ๋ง๋๋ ๊ฒ๋ณด๋ค try()
์ ๋น๊ตํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
ํจ์์ ๋ํ ๋ ๋ค๋ฅธ ํ๋ฆ ์ ์ด ๊ตฌ์กฐ๊ฐ ์๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ด ์ค์ ๋งจ ์ผ์ชฝ ํญ๋ชฉ์ด ๋๋๋ก ๋ณด์ฅ๋ ๋ช ๋ น๋ฌธ์ _far_ ์ ํธํ ๊ฒ์ ๋๋ค.
์ ์์์ ์ ์ค ํ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
func printSum(a, b string) error {
fmt.Println(
"result:",
try(strconv.Atoi(a)) + try(strconv.Atoi(b)),
)
return nil
}
์ ์ด ํ๋ฆ์ ์ค์ ๋ก ๋ ๋ช ํํด์ง๊ณ ๋งค์ฐ ๋ชจํธํด์ง๋๋ค.
์ด๊ฒ์ ๋ํ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค๋ Rob Pike์ ์ด๊ธฐ ์๋์ ์๋ฐฐ๋ฉ๋๋ค.
์ด์ ๋ํ ๋ฐ์์ "์ฌ์ฉํ์ง ๋ง์ธ์"์ผ ์ ์์ง๋ง ๋ฌธ์ ๋ -- ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ๊ฒ์ด๊ณ ๋๋ฒ๊น
ํ๊ณ ์ฝ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ฌธ์ ๊ฐ ๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ ํ์ฌ๊ฐ go 2๋ฅผ ์ฑํํ์ง ์๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๊ณ try
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํ๊ธฐ ์์ํฉ๋๋ค. ๋ ํผ์๊ฐ ์๋๋ผ๋ฉด python 2/3 ๋ถํ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ํ try
์ ์ด๋ฆ์ ๊ฒฐ๊ตญ catch
๊ฐ ๊ตฌ๋ฌธ์ ํ์๋๊ณ Java๋ก ๋์๊ฐ ๊ฒ์์ ์๋์ผ๋ก ์์ํฉ๋๋ค.
์ด ๋ชจ๋ ๊ฒ ๋๋ฌธ์ ์ ๋ ์ด ์ ์์ _๊ฐ๋ ฅํ๊ฒ_ ๋ฐ๋ํฉ๋๋ค.
try
์ด๋ฆ์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. ์ด๊ฒ์ ์คํจ ์ํ์ด ๋์ ์ผ์ ํ๋ ค๋ _์๋_๋ฅผ ์๋ฏธํฉ๋๋ค(์ ๋ ์์ด๊ฐ ๋ชจ๊ตญ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ try
์ ๋ํ ๋ฌธํ์ ํธ๊ฒฌ์ด ์์ ์ ์์ต๋๋ค). (์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ ์ค์ด๋ ค๋ ๋๊ธฐ) ๋๊ด์ ์
๋๋ค. ๋ํ ์ด ์ ์์์ try
๋ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ์กฐ๊ธฐ์ ๋ฐํํ๋ _์บ์น_ํฉ๋๋ค. @HiImJC์ pass
์ ์์ด ๋ง์์ ๋ญ๋๋ค.
์ด๋ฆ ์ธ์๋ return
์ ๊ฐ์ ๋ฌธ์ด ์ด์ ํํ์ ์ค๊ฐ์ ์จ๊ฒจ์ ธ ์๋ ๊ฒ์ด ์ด์ํฉ๋๋ค. ์ด๊ฒ์ Go ํ๋ฆ ์คํ์ผ์ ๊นจ๋จ๋ฆฝ๋๋ค. ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ๋๋ ์ด ์ ์์ด ๋ ์งง์ ์ฝ๋๋ฅผ ์ํ ๋ฌด๊ธฐ๋ฅผ ๊ฐ๊ณ ์๊ณ ์ค๋ฅ๋ฅผ ๋ํํ๋ ๋ ธ๋ ฅ์ ํ ์ด์ ๊ฐ ํจ์ฌ ์ ์ ๊ฒ์ผ๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ๋ง ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์(ํํ ์ค๊ฐ์ ๋ฐํ), ์ด ์ ์์ ๋ฐ๋์ "๋๊ท๋ชจ ํ๋ก๊ทธ๋๋ฐ" ๋ชฉํ์ ์ด๊ธ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
Go์ ๋ํด ๋ด๊ฐ ์ธ์ด๋ฅผ ์ค๋ช ํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋งํ๋ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ ์ค ํ๋๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด ํ๋๋ฟ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ด ์ ์์ ๋์ผํ ์์ ์ ์ํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ ๊ทธ ์์น์ ์ฝ๊ฐ ์ด๊ธ๋ฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ด ํ์ํ์ง ์์ผ๋ฉฐ ์ธ์ด์ ๋จ์์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ์ถ๊ฐํ๊ธฐ๋ณด๋ค๋ ์ ๊ฑฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด ์ ์์ด ์ ๋ฐ์ ์ผ๋ก ๋ง์์ ๋ ๋ค. defer
์์ ์ํธ ์์ฉ์ ์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ฉด์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ์ธ์ฒด ๊ณตํ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ์ ์ถฉ๋ถํด ๋ณด์
๋๋ค. @josharian ์ด ๋ํ๋ ์ค๋ฅ ๋ฉ์์ง์ ์๋ ์ค๋ฅ๋ฅผ ํฌํจํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ง์ ํ ๊ฑธ๋ฆผ๋์ ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์ง๋ง.
๋๋ฝ๋ ๊ฒ์ ํ ์ด๋ธ์ ์๋ ์ค๋ฅ ๊ฒ์ฌ ์ ์๊ณผ ์ํธ ์์ฉํ๋ ์ธ์ฒด ๊ณตํ์ ๋ฐฉ๋ฒ์ ๋๋ค. API๋ ๋ฐํํ๋ ์ค๋ฅ ์ ํ์ ๋ํด ๋งค์ฐ ์ ์คํด์ผ ํ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ ์๋ง๋ "๋ฐํ๋ ์ค๋ฅ๋ ์ด๋ค ์์ผ๋ก๋ ๊ฒ์ฌํ ์ ์์"์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ํจ์ ์๋ช ("์ํฉ A์์ ์ข ๋ฅ X์ ์ค๋ฅ ๋ฐ ์ํฉ B์์ ์ข ๋ฅ Y์ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค")์ ์ํด ๋ฌธ์ํ๋ ๊ฒ์ฒ๋ผ ์ ํํ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ ์ ์๋ ์ํ๋ก ์ฝ๊ฒ ์ด๋ํด์ผ ํฉ๋๋ค.
๋ถํํ๋ ํ์ฌ๋ก์๋ ์ด ์ ์์ด ๊ฐ์ฅ ์ธ์ฒด๊ณตํ์ ์ธ ์ต์ ์ (๋์๊ฒ) ๊ฐ์ฅ ๋ฐ๋์งํ์ง ์์ ๊ฒ์ผ๋ก ๋ง๋ญ๋๋ค. ๋งน๋ชฉ์ ์ผ๋ก ์์์ ์ค๋ฅ ์ข ๋ฅ๋ฅผ ํต๊ณผํฉ๋๋ค. ๋ฐํํ๋ ์ค๋ฅ์ ์ข ๋ฅ์ API ์ฌ์ฉ์๊ฐ ์ค๋ฅ๋ฅผ ์๋นํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ์ง ์๋๋ก ๊ถ์ฅํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ฐ๋์งํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ ์์ ์ถ๊ฐ๋ ํธ๋ฆฌํจ์ ํ์คํ ์ข์ง๋ง, ์ธ์๋ ํธ๋ฆฌํจ์ด ์ฌ์ฉ์๊ฐ ์ ๊ณตํ๋(๋๋ ๋์ถ) ์ค๋ฅ ์ ๋ณด์ ๋ํด ์ ์คํ๊ฒ ์๊ฐํ๋ ์ธ์๋ ๊ฐ์น๋ณด๋ค ๋ ํฌ๊ธฐ ๋๋ฌธ์ ๋์ ํ๋์ ์กฐ์ฅํ ๊น๋ด ๋๋ ต์ต๋๋ค.
๋ฐ์ฐฝ๊ณ ๋ try
์ ์ํด ๋ฐํ๋ ์ค๋ฅ๊ฐ "๋ํํ ์ ์๋" ์ค๋ฅ๋ก ๋ณํ๋๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ defer
๊ฐ ์ค๋ฅ ์์ฒด๋ฅผ ๊ฒ์ฌํ ์ ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ฝค ์ฌ๊ฐํ ๋จ์ ๋ ์์ต๋๋ค. ๋ํ try
๊ฐ ์ค์ ๋ก ๋ฐ๋์งํ ์ข
๋ฅ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ์ฌ์ฉ์ ๋ฐฉ์งํฉ๋๋ค(์ฆ, try
๊ฐ ๋ถ์ฃผ์ํ์ง ์๊ณ ์ ์คํ๊ฒ ์ฌ์ฉ๋๋ ์ฌ์ฉ ์ฌ๋ก).
๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ ํด๋น ์ฌ์ดํธ์์ ๋ฐํ๋ ์ ์๋ ์ค๋ฅ ์ข
๋ฅ๋ฅผ ์ ์/ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ธฐ ์ํด try
์ ๋ํ ์ ํ์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ๊ฐ๋ (ํ๊ธฐ๋) ์์ด๋์ด์ ์ฉ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค. ๊ฐ( io.EOF
๋ฑ) ๋๋ ์ ํ( *os.PathError
, *exec.ExitError
)์ผ๋ก "์ค๋ฅ ์ข
๋ฅ"๋ฅผ ์ ์ํ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ๊ฐ์ ํจ์์ ๋ํ ์ธ์๋ก ์ง์ ํ๋ ๊ฒ์ ์ฝ์ง๋ง ์ ํ์ ์ง์ ํ๋ ๊ฒ์ ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ง๋ง ์์ด๋์ด๋ฅผ ๋์ง๊ณ ์์ต๋๋ค.
@josharian ์ด ์ง์ ํ ๋ฌธ์ ๋ err ํ๊ฐ๋ฅผ ์ง์ฐํจ์ผ๋ก์จ ํผํ ์ ์์ต๋๋ค.
defer func() { fmt.HandleErrorf(&err, "oops: %v", err) }()
๋ณด๊ธฐ์๋ ์ข์ง ์์ง๋ง ์๋ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ ํฌ์ธํฐ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ํฌ์ธํฐ์ ๋ํด ์ ํ์ํ ๋์ฌ/ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ผ๋ฐ %v
์ ๊ฐ์ด ์ญ์ฐธ์กฐ๋ ๊ฐ์ ์ธ์ํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด %*v
๋ผ๊ณ ํฉ์๋ค.
defer fmt.HandleErrorf(&err, "oops: %*v", &err)
๊ฑธ๋ฆผ๋์ ์ ์๊ฐ์ ์ด ์ ์์ด ์ ๋งํด ๋ณด์ด์ง๋ง ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ์ธ์ฒด ๊ณตํ์ ํ์ธํ๋ ๊ฒ์ด ์ค์ํด ๋ณด์ ๋๋ค.
ํธ์งํ๋ค:
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ Stringer
๋ฅผ ๊ตฌํํ๋ ๊ตฌ์กฐ์ฒด์์ ์ค๋ฅ ํฌ์ธํฐ๋ฅผ ๋ํํ๋ ๊ฒ์
๋๋ค.
type wraperr struct{ err *error }
func (w wraperr) String() string { return (*w.err).Error() }
...
defer handleErrorf(&err, "oops: %v", wraperr{&err})
๋ด ๊ด์ ์์ ๋ช ๊ฐ์ง. ์ ์ฐ๋ฆฌ๋ ๋ช ์ค์ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋ํด ๊ทธ๋ ๊ฒ ๊ฑฑ์ ํฉ๋๊น? ๋๋ ์ด๊ฒ์ ์ ํดํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์์ ๊ธฐ๋ฅ ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ ๋ คํฉ๋๋ค.
๋ํ ๊ทธ๋ฌํ ์ ์์ด ์ผ๋ถ "๋ง๋ฒ"์ ๋ํ ์ค๋ฅ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฑ ์์ ์ ๊ฑฐํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๋ช ์๋ ์ ์์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ถ๋ถ๋ช ํ ๋์์ด ์์ผ๋ฏ๋ก ๋ ๋ช ํํ _explicit_ ์ถ๊ฐ ~3์ค๋ณด๋ค ์ด๋ฏธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ ์ง์์ ์ฐ๊ธฐ ํจํด์ ๋๋ฌผ๊ฒ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฑํ์ ๋ ๋น์ทํ๊ฒ ํผํฉ๋ ์์ ์ ๋ณด์ธ ๊ธฐ์ฌ๊ฐ ์์ต๋๋ค - https://bet365techblog.com/better-error-handling-in-go
๊ทธ๋ฌ๋ check
/ handle
์ ์์ด ์งํ๋๋ ๊ฒ์ ์์ํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
Check/handle์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ๋ง๋๋ ํจ์ฌ ๋ ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด์์ต๋๋ค. handle
๋ธ๋ก์ ์ ์๋ ๊ฒ๊ณผ ๋์ผํ ๊ธฐ๋ฅ ๋ฒ์๋ฅผ ์ ์งํ ๋ฐ๋ฉด, ๋ชจ๋ defer
๋ฌธ์ ์์ ์๊ด์์ด ์ค๋ฒํค๋๊ฐ ๋ง์ ์๋ก์ด ์ปจํ
์คํธ์
๋๋ค. ์ด๊ฒ์ go์ ๊ด์ฉ๊ตฌ์ ๋ ๋ถํฉํ๋ ๊ฒ ๊ฐ์์ต๋๋ค. "๋ฐ์ํ ๋ ์ค๋ฅ๋ฅผ ๋ฐํ"ํ๋ ๋์์ ์ํ๋ฉด ๋ช
์์ ์ผ๋ก handle { return err }
๋ก ์ ์ธํ ์ ์์ต๋๋ค.
Defer๋ ๋ถ๋ช ํ ์ ์ง๋๋ ์ค๋ฅ ์ฐธ์กฐ์๋ ์์กดํ์ง๋ง ๋ธ๋ก ๋ฒ์ vars๋ก ์ค๋ฅ ์ฐธ์กฐ๋ฅผ ์๋์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์ค์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ํ์ค ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผ๋ ๋งํผ ์ถฉ๋ถํ ์ด๋ฆฌ์์ ๊ฒ์ ์๋๋๋ค.
์ด ๊ฒฝ์ฐ try
๋ ๋๋ฌด ๋ง์ด ํด๊ฒฐ๋์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋จ์ํ ์ง์ฐ ๊ตฌํ ๋๋ ์ง์ฐ ํจํด์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ ๊ตฌํ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๋ ๋๋ ค์์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํฉ๋๋ค.
์ง์ฐ ๊ธฐ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ A Thing์ด ๋ ๊ฒฝ์ฐ ๋ค์ ๊ณผ ๊ฐ์ ๊ฒ์ด ์ค๋ฅ ํจํค์ง์ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค.
f := try(os.Create(filename))
defer errors.Deferred(&err, f.Close)
์ง์ฐ๋ Close ๋ฌธ์ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ์ด๋ฅผ ๋๊ธฐ ์ํ ํ์ค ๋๊ตฌ๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ฐํํ๋ ๋ด์ฅ ํจ์๋ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋ ํค์๋๋ณด๋ค ํ๋งค๊ฐ ์ด๋ ต์ต๋๋ค.
Zig[1]์ฒ๋ผ ํค์๋์์ผ๋ฉด ๋ ์ข๊ฒ ๋ค.
์ธ์ด์ ์ ํ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ ํ ์๋ช ์ ํํํ ์ ์๊ณ ๊ทธ ๋์์ด ํจ์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์์ธ์ง ํผ๋ํ๋ ๋ด์ฅ ํจ์๋ ์ค์ ์ธ์ด ์งํ๋ฅผ ํผํ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํ์ถ๊ตฌ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ ์ ์ด ํ๋ฆ์ด Go(๋ฐ ๋ค๋ฅธ ๋ง์ ์ธ์ด)์์ ํํ๋๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ ๋ฌธ(๋ฐ ํจ๋)์ ์ฆ์ ์ธ์ํ๋ ๋ฐ ์ต์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฆฌํด์ ์ํด ํ๋ ๊ฒ์ฒ๋ผ ์ผ๋ถ๊ฐ ์ต์ํด์ง๋ฉด try๋ฅผ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์ธ์ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ข์ IDE ์ง์์ด ์ด๊ฒ์๋ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ด ์์ฌ์น ์์ต๋๋ค.
์๋นํ ๋ฌด๋ฆฌ์๋ผ๊ณ ์๊ฐํฉ๋๋ค. gofmt's ์ฝ๋์์ ๋ฐํ๊ฐ์ ํญ์ /^\t*return /
์ ์ผ์นํฉ๋๋ค. ๋์ ์์ด๋ ๋์ผ๋ก ์๋ณํ ์ ์๋ ๋งค์ฐ ์ฌ์ํ ํจํด์
๋๋ค. ๋ฐ๋ฉด์ try
๋ ์ฝ๋์ ์ด๋ ๊ณณ์์๋ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ํจ์ ํธ์ถ์์ ์์๋ก ๊น์์ด ์ค์ฒฉ๋ฉ๋๋ค. ๊ต์ก์ ์๋ฌด๋ฆฌ ๋ง์ด ํด๋ ๋๊ตฌ ์ง์ ์์ด ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ์ฆ์ ๋ฐ๊ฒฌํ ์๋ ์์ต๋๋ค.
๋ํ "์ข์ IDE ์ง์"์ ์์กดํ๋ ๊ธฐ๋ฅ์ ์ข์ IDE ์ง์์ด ์๋ ๋ชจ๋ ํ๊ฒฝ์์ ๋ถ๋ฆฌํฉ๋๋ค. ์ฝ๋ ๊ฒํ ๋๊ตฌ๊ฐ ์ฆ์ ๋ ์ค๋ฆ
๋๋ค. Gerrit๊ฐ ๋ชจ๋ ์๋๋ฅผ ๊ฐ์กฐ ํ์ํ ๊น์? ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก IDE ๋๋ ๋ฉ์ง ์ฝ๋ ๊ฐ์กฐ ํ์๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ์ ํํ ์ฌ๋๋ค์ ์ด๋ป์ต๋๊น? acme๊ฐ try
๊ฐ์กฐ ํ์ํ๊ธฐ ์์ํฉ๋๊น?
์ธ์ด ๊ธฐ๋ฅ์ ํธ์ง๊ธฐ ์ง์์ ์์กดํ์ง ์๊ณ ๊ทธ ์์ฒด๋ก ์ดํดํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค.
@kungfusheep ๋๋ ๊ทธ ๊ธฐ์ฌ๋ฅผ ์ข์ํ๋ค. defer๋ง์ผ๋ก ๋ํ์ ์ฒ๋ฆฌํ๋ฉด try
์์ด ์ด๋ฏธ ๊ฐ๋
์ฑ์ด ์๋นํ ํฅ์๋ฉ๋๋ค.
๋๋ Go์ ์ค๋ฅ๊ฐ ์ค์ ๋ก ๋ฌธ์ ๋ผ๊ณ ๋๋ผ์ง ์๋ ์บ ํ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ if err != nil { return err }
๋ ์ผ๋ถ ๊ธฐ๋ฅ์์ ์๋นํ ๋ฒ๋ฒ
๊ฑฐ๋ฆด ์ ์์ต๋๋ค. ๋๋ ๊ฑฐ์ ๋ชจ๋ ๋ช
๋ น๋ฌธ ํ์ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํ์ํ ํจ์๋ฅผ ์์ฑํ์ผ๋ฉฐ ๋ฉ ๋ฐ ๋ฐํ ์ด์ธ์ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ ํจ์๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ก๋ ์ํฉ์ ๋ ์ข๊ฒ ๋ง๋๋ ์๋ฆฌํ Buffer ๊ตฌ์กฐ์ฒด๊ฐ ์์ ๋๊ฐ ์์ต๋๋ค. ๋๋๋ก ์ด๊ฒ์ ๋ค๋ฅธ ์ค์ํ ๋จ๊ณ์ผ ๋ฟ์ด๋ฉฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋จ์ํ ๋จ๋ฝ์์ผ์ผ ํฉ๋๋ค.
try
๊ฐ ํ์คํ ์ด์ ๋ฒ์ ๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋๋ ๋์ ํด๋น ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ง๋ง try
๊ฐ ์ค์ํ ํ์ ๊ธฐ๋ฅ์ด ์๋๋ฏ๋ก ์ฌ๋๋ค์ด ๋๋ฌด ๋๋ ค์ํ๋ ๊ฒฝ์ฐ ์๋ ๊ฒ์ด ์ต์ ์ผ ์๋ ์์ต๋๋ค.
์๋ฏธ๋ก ์ ์์ฃผ ๋ช
ํํฉ๋๋ค. try
๋ฅผ ๋ณผ ๋๋ง๋ค ํ๋ณตํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๊ฑฐ๋ ๋ฐํ๋ฉ๋๋ค. ์ ๋ง ์ด๋ณด๋ค ๋ ๊ฐ๋จํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํน์ ์ผ์ด์ค ๋งคํฌ๋ก์ฒ๋ผ ๋ณด์ ๋๋ค.
@dominikh try
๋ ํญ์ /try\(/
์ ์ผ์นํ๋ฏ๋ก ๊ทํ์ ์์ ์ด ์ค์ ๋ก ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฒ์ ๊ฐ๋ฅํ๊ณ ๋ด๊ฐ ๋ค์ด๋ณธ ๋ชจ๋ ํธ์ง๊ธฐ์๋ ๊ฒ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
@qrpnxz ๋ด ์๊ฐ์ ๊ทธ๊ฐ ๋งํ๋ ค๋ ์์ ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฒ์ํ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ ๋์ผ๋ก ๊ฒ์ํ๊ธฐ๊ฐ ๋ ์ด๋ ต๋ค๋ ๊ฒ์
๋๋ค. ์ ๊ท ํํ์์ /^\t*
์ ์ค์ ์ ๋ ์ ์ถ์ผ ๋ฟ์ด๋ฉฐ, ์ด๋ ๋ชจ๋ ๋ฐํ๊ฐ์ด ์ค์ ์์ ๋ถ๋ถ์ ์์์ ์๋ฏธํฉ๋๋ค(์ ํ ๊ณต๋ฐฑ ๋ฌด์).
์ข ๋ ์๊ฐํด๋ณด๋ฉด ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ด ์์ด์ผ ํฉ๋๋ค. ์๋ง๋ "์ง์ฐ"์ด๋ผ๋ ํจํค์ง์ ์์ด์ผ ํฉ๋๋ค.
check
์ ๋ํ ์ ์์ ํ์์ผ๋ก ์ง์ ํ์ฌ ๋ฐํ ์ด๋ฆ์ ์ง์ ํ์ง ์๋๋ก ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด nil์ ํ์ธํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
func Format(err error, message string, args ...interface{}) error {
if err == nil {
return nil
}
return fmt.Errorf(...)
}
๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ช ๋ ๋ฐํ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
func foo(s string) (int, error) {
n, err := strconv.Atoi(s)
try(deferred.Format(err, "bad string %q", s))
return n, nil
}
์ ์๋ fmt.HandleError๋ ๋์ ์ง์ฐ๋ ํจํค์ง์ ๋ฃ์ ์ ์๊ณ ๋ด errors.Defer ๋์ฐ๋ฏธ ํจ์ ๋ deferred.Exec
๋ก ํธ์ถ๋ ์ ์์ผ๋ฉฐ ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ์๋ง ์คํ๋๋ ํ๋ก์์ ์ ๋ํ ์กฐ๊ฑด๋ถ ์คํ์ด ์์ ์ ์์ต๋๋ค.
ํฉ์น๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
func CopyFile(src, dst string) (err error) {
defer deferred.Annotate(&err, "copy %s %s", src, dst)
r := try(os.Open(src))
defer deferred.Exec(&err, r.Close)
w := try(os.Create(dst))
defer deferred.Exec(&err, r.Close)
defer deferred.Cond(&err, func(){ os.Remove(dst) })
try(io.Copy(w, r))
return nil
}
๋ ๋ค๋ฅธ ์:
func (p *pgStore) DoWork() (err error) {
tx := try(p.handle.Begin())
defer deferred.Cond(&err, func(){ tx.Rollback() })
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
try(deferred.Format(err, "insert table")
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
try(deferred.Format(err, "insert table2"))
return tx.Commit()
}
if err != nil
๋ฅผ ๊ฐ๋ ๊ฒ์์ ๋ชจ๋ ๊ณณ์์ try
๋ฅผ ๊ฐ๋๋ก ํฉ๋๋ค. ์ ์๋ ๋ฌธ์ ๋ฅผ ์ด๋ ์ํค๊ณ ํด๊ฒฐํ์ง ์์ต๋๋ค.๊ทธ๋ฌ๋ ํ์ฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ์ฒ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฃผ๋ณ์ ๋๊ตฌ ์ ์กฐ์ฌ ๋ฅผ ๊ฐ์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ํ if err != nil
๋ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ ์ธ์ด์ ๋ผ์ธ์ ์ด์ง๋ฝํ์ง ์๊ณ ๋ฐ๋ก ์๋์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก try
๋ณด๋ค ๊ฐ๋
์ฑ์ด ๋ ๋๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
file := try(os.OpenFile("thing")) // less readable than,
file, err := os.OpenFile("thing")
if err != nil {
}
๊ทธ๋ฆฌ๊ณ Go๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์์ด์ ๋ ๋ง๋ฒ ๊ฐ๋ค๋ฉด, Go๋ฅผ ์์ ํ ์์ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์๋ฅผ ๋ค์ด Go๋ ์ฌ์ฉ์๊ฐ ์ค๋ฅ๋ฅผ ํ ๋นํ์ง ์์ผ๋ฉด ๋ด์ฅ try
๋ฅผ ์์์ ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
func getString() (string, error) { ... }
func caller() {
defer func() {
if err != nil { ... } // whether `err` must be defined or not is not shown in this example.
}
// would call try internally, because a user is not
// assigning an error value. Also, it can add a compile error
// for "defined and not used err value" if the user does not
// handle the error.
str := getString()
}
๋์๊ฒ ๊ทธ๊ฒ์ ๋ง์ ๊ณผ ์ ์ฌ์ ์ธ ๊ฐ๋ ์ฑ์ ํฌ์์ํค๋ฉด์ ์ค์ ๋ก ์ค๋ณต์ฑ ๋ฌธ์ ๋ฅผ ๋ฌ์ฑํ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์์ ์์ ๊ฐ์ด '๋ฌธ์ '๋ฅผ ์ง์ ์ผ๋ก ํด๊ฒฐ ํ๊ฑฐ๋ ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ์งํ๋ ์ค๋ณต ๋ฐ ๋ํ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋๊ตฌ ๋ฐ ๊ฒ์ฌ ๋ฅผ ๊ฐ์ ํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋ ๋์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ฝ๋์ ๋๋ค.
์๋ฅผ ๋ค์ด VSCode์๋ iferr
๋ผ๋ ์ค๋ํซ์ด ์์ต๋๋ค. ์ด๋ฅผ ์
๋ ฅํ๊ณ Enter ํค๋ฅผ ๋๋ฅด๋ฉด ์ ์ฒด ์ค๋ฅ ์ฒ๋ฆฌ ๋ช
๋ น๋ฌธ์ผ๋ก ํ์ฅ๋ฉ๋๋ค...๋ฐ๋ผ์ ์์ฑํ๋ ๊ฒ์ด ์ง๋ฃจํ์ง ์๊ณ ๋์ค์ ์ฝ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. .
@josharian
"์ ๋นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ๊ฒฝ"์ ์๋์ง๋ง func main() ์ค๋ฅ๋ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ๋ชจ๋ ํ๋ซํผ์ด ๊ทธ ์๋ฏธ์ ๋ํ ๋ช
ํํ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์์ง ์๋ค๋ ๊ฒ์
๋๋ค. ์ฌ์์ฑ์ ์ ์ฒด ์ด์ ์ฒด์ ์์ ์คํ๋๋ "๊ธฐ์กด" Go ํ๋ก๊ทธ๋จ์์ ์ ์๋ํ์ง๋ง ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ํ์จ์ด ๋๋ WebAssembly๋ง ์์ฑํ์๋ง์ os.Exit(1)
๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ช
ํํ์ง ์์ต๋๋ค. ํ์ฌ os.Exit
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ์ด๋ฏ๋ก Go ๊ตฌํ์ ๊ทธ๊ฒ์ ์ ๊ณตํ์ง ์๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฌด๋ฃ์
๋๋ค. main
์ ๋ชจ์์ ์ธ์ด ๋ฌธ์ ์
๋๋ค.
์ ์์ ๋ํ ์ง๋ฌธ ์ค "์๋์ค"๋ก ๊ฐ์ฅ ์ ๋๋ตํ ์ ์๋ ์ง๋ฌธ: try
๋ ๊ฐ๋ณ ์ธ์์ ์ด๋ป๊ฒ ์ํธ ์์ฉํฉ๋๊น? ๋ง์ง๋ง ์ธ์์ ๊ฐ๋ณ์ฑ์ด ์๋ ๊ฐ๋ณ์ฑ(ish) ํจ์์ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์
๋๋ค. ์ด๊ฒ์ด ํ์ฉ๋ฉ๋๊น?
var e []error
try(e...)
์ ๊ทธ๋ฐ ์ง์ ํ๋์ง๋ ์ ์ณ๋๊ณ . ๋๋ ๊ทธ ๋๋ต์ด "์๋์"๋ผ๊ณ ์๊ฐํฉ๋๋ค.(๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ ์กฐ์น๋ "ํ์ฅ๋ ์ฌ๋ผ์ด์ค์ ๊ธธ์ด๊ฐ 0์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?) ๊ฒฐ๊ตญ ์ฌ์์ ํํํ ๋ ์ผ๋์ ๋ ์ ์๋๋ก ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ๋ฟ์ ๋๋ค.
try
์ ์์ ์ ์ด ํ๋ฆ ๊ฐ๋
์ฑ์ ํฌ์์ํค๋ฉด์ ์๊ธฐ๋ฅผ ์ด์งํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ธฐ๋ณธ ์์น๊ณผ ์ผ์นํ์ง ์์ต๋๋ค.try
๋ด์ฅ ๋ช
๋ น๋ฌธ ์ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ฉด if
์ ๊ฐ์ ๋ค๋ฅธ ์ ์ด ํ๋ฆ ๋ฌธ๊ณผ ๋ ์ผ๊ด์ฑ์ด ์์ต๋๋ค. ๋ํ ์ค์ฒฉ๋ ๊ดํธ๋ฅผ ์ ๊ฑฐํ๋ฉด ๊ฐ๋
์ฑ์ด ์ฝ๊ฐ ํฅ์๋ฉ๋๋ค.defer
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌํํ์ญ์์ค. (๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ ๊ฒ์ฒ๋ผ) ์ด๋ฏธ ์์ํ ์ด๋์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ํ๋ ์๋์์๋ณด๋ค ํจ์จ์ ์ธ ๊ตฌํ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.๋๋ ์ด๊ฒ์ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ณธ๋ค.
์ซ์ 2๋ ํจ์ฌ ๋ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฐ๋จํ ํธ์ถ์ด์ง๋ง ํจ์ฌ ๋ ๊ตํํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func doit(abc string) error {
a := fmt.Sprintf("value of something: %s\n", try(getValue(abc)))
log.Println(a)
return nil
}
์ด ์ฝ๋๋ sprintf ์ค๊ฐ์ ์ข ๋ฃ๋ ์ ์์ผ๋ฉฐ ๊ทธ ์ฌ์ค์ ๋์น๊ธฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
๋ด ํฌํ๋ ์๋์ค์ ๋๋ค. ์ด๊ฒ์ go ์ฝ๋๋ฅผ ๋ ์ข๊ฒ ๋ง๋ค์ง ์์ต๋๋ค. ์ฝ๊ธฐ๊ฐ ์ฝ์ง ์์ ๊ฒ์ ๋๋ค. ๋ ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค.
์ ์๋ ๋งํ์ง๋ง ์ด ์ ์์ด ๊ทธ๊ฒ์ ์์ํฉ๋๋ค. Go์ ๋ํ ๋ถ๋ง์ 90%๋ "๋๋ if ๋ฌธ์ด๋ ๋ฃจํ๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค" ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ if ๋ฌธ์ ์ ๊ฑฐํ์ง๋ง ์ธ์ง ๋ถํ๋ฅผ ์ถ๊ฐํ๊ณ ํจ์์ ์ข ๋ฃ์ ์ ๋์น๊ธฐ ์ฝ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ฉ์ธ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์๋ก์ด ์ฌ์ฉ์๋ ๊ฐ๋ฅด์น ๋ ํผ๋์ค๋ฌ์ธ ์ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ๋ถ๋ช ํ ์ด๊ฒ์ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ๋ชจ๋ ํจ์์ ์ ์ฉ๋์ง๋ง ๋ง์ ์์ ์์ ๋ํ๋๊ธฐ ๋๋ฌธ์ main์ ํน๋ณํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
func main() {
f := try(os.Open("foo.txt"))
defer f.Close()
}
main์์ try ๊ณตํฉ ์ํ๋ก ๋ง๋๋ ๊ฒ๋ ํ์ฉ๋๋์ง ํ์ ํ ์ ์์ต๋๋ค.
๋ํ ๋ถํํ๋ ํ
์คํธ ( func TestFoo(t* testing.T)
)์์๋ ํนํ ์ ์ฉํ์ง ์์ต๋๋ค.
๋ด๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ํญ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ค๋ฅด๊ฒ ํ๋ํ๊ณ ์ถ์ ๋. ๋ฐํ๋ ์ค๋ฅ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์๋ try/catch์ ์ ์ฌํ ๊ฒ์ ์ ํธํฉ๋๋ค.
foo()
๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
func foo() (int, error) {}
๊ทธ๋ฌ๋ฉด ํ ์ ์์ต๋๋ค.
n := try(foo()) {
case FirstError:
// do something based on FirstError
case OtherError:
// do something based on OtherError
default:
// default behavior for any other error
}
๋ฒ์ญ
n, err := foo()
if errors.Is(err, FirstError) {
// do something based on FirstError
if errors.Is(err, OtherError) {
// do something based on OtherError
} else {
// default behavior for any other error
}
๋์๊ฒ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋์
๋๋ค.
์ด๋ฏธ ๋๋ฌด ๋ง์ go ์ฝ๋๊ฐ if err != nil { return err }
์
๋๋ค. ์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์คํ ๊น์ํ ๊ณณ์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฑฐ๋ fmt.Errorf
๋ํ์ผ๋ก ๊ธฐ๋ณธ ์ค๋ฅ๋ฅผ ๋ง์คํนํ์ฌ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ (์๋ง๋) ๋ ๋๋น ์ง๋๋ค.
if err != nil { return err }
๋ฅผ ๋์ฒดํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ์ผ์ข
์ ๋ง๋ฒ ๊ฐ์ ์ ํค์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ํํ ๊ธธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋ชจ๋ ์ฝ๋๋ ์๋ ํธ์ถ๋ก ๋ํ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํจํค์ง ๋ด ์ค๋ฅ๋ง ์ฒ๋ฆฌํ๋ ์ฝ๋์ ๊ฒฝ์ฐ ๋ค์ ๊ด์ฐฎ์ต๋๋ค(๊ฐ๋
์ฑ์ ๋จ์ด์ง).
func foo() error {
/// stuff
try(bar())
// more stuff
}
๊ทธ๋ฌ๋ ๋๋ ์ฃผ์ด์ง ์์ ๊ฐ ์ ๋ง ๋์ฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ์ถ์๊ฐ ์์ธ ์ฒ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ์ ์ ๋ง ๊น์ ์ค๋ฅ๋ฅผ ์ดํดํ๋ ค๊ณ ์๋ํ๊ฒ ๋ง๋ ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
๋ฌผ๋ก ์ฌ๊ธฐ์์ ์ฌ๋ฐ๋ฅธ ์ผ์ ํ๋ ๊ฒ์ ๋ชจ๋ ๊ฐ๋ฐ์์ ๋ชซ์ด์ง๋ง, "๋์ค์ ์์ ํ ๊ฒ"์ด๋ผ๋ ์ค๋ฅ์ ๋ํด ๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ ์ข์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ).
๋๋ ์ฐ๋ฆฌ๊ฐ *"์ด๋ป๊ฒ ํ๋ฉด ๋ฐ๋ณต์ ์ค์ผ ์ ์๋๊ฐ"์ "(์ ์ ํ) ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ณ ๊ฐ๋ฐ์๋ฅผ ๋ ์์ฐ์ ์ผ๋ก ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ"์ ๋ํด ๋ ๋ง์ ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ๋ณด์์ผ๋ฉด ํฉ๋๋ค.
์ด๊ฒ์ด ํ๋ก๋์
์ฝ๋ ์คํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ์๊ฐํด์ผ ํฉ๋๋ค.
*์ฐธ๊ณ : ์ด๊ฒ์ ์ค์ ๋ก ๋ฐ๋ณต์ ์ค์ด๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ณต๋๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ฟ์
๋๋ค. ๋ชจ๋ ๊ฒ์ด try()
์์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋๋ค.
๋ง์ง๋ง ์์ : ์ฒ์์๋ ์ ์์ ์ฝ๋ ๊ฒ์ด ์ข์ ๋ณด์ด์ง๋ง ๋ชจ๋ ๋ฌธ์ (์ ์ด๋ ๋์ด๋ ํญ๋ชฉ)์ ๋น ์ง๊ธฐ ์์ํ๊ณ "๊ทธ๋, ์ด๊ฑด ๋๋ฌดํด"์ ๊ฐ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ง์ ๋ถ๋ถ์ด ์ฃผ๊ด์ ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ๊ฒ์ ๋ด๊ฐ ๊ด์ฌ์ ๊ฐ๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ์๋ฏธ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ด๊ฐ ๋ณด๊ณ ์ถ์ ๊ฒ์ POC/๋ฐ๋ชจ ์์ค ์ฝ๋์ ๋ํด์๋ "์ฌ๋ฐ๋ฅธ" ์ค๋ฅ๋ฅผ ์ํํ ์ ์๋๋ก ํ๋ก๋์
์์ค ์ฝ๋ ์์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ค๋ฅ ์ปจํ ์คํธ๊ฐ ๋ฐ๋ณต๋๋ ํ ๋ง์ธ ๊ฒ ๊ฐ์์...
๊ฐ์ค: ๋๋ถ๋ถ์ Go ํจ์๋ $ (T1, T2, T3, error)
$๊ฐ ์๋ (T, error)
๋ฅผ ๋ฐํํฉ๋๋ค.
try
๋ฅผ try(T1, T2, T3, error) (T1, T2, T3)
๋ก ์ ์ํ๋ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
try(func (args) (T1, T2, T3, error))(T1, T2, T3)
? (์ด๊ฒ์ ๊ทผ์ฌ์น์
๋๋ค)
์ฆ, try
ํธ์ถ์ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ ํญ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๋ ํํ์์ธ ์ฒซ ๋ฒ์งธ ์ธ์์ด๋ฉฐ ๋ง์ง๋ง ์ธ์๋ ์ค๋ฅ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ make
์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๋ฒ์งธ ์ธ์๊ฐ try ์ปจํ
์คํธ(์: ๊ณ ์ ๋ฌธ์์ด, %v
, ์ค๋ฅ ์ธ์๋ฅผ ์ทจํ๊ณ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์ ๋ฑ)
์ด๊ฒ์ ์ฌ์ ํ (T, error)
์ผ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ ํ์ฉํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก IMO๊ฐ ํ์ํ์ง ์์ ๋ค์ค ๋ฐํ์ ๋ ์ด์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
@cpuguy83 ์ ์์๋ฅผ ์ฝ์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ๊ฒ์ด ์์์ ์ ์ ์์ต๋๋ค. ์ค์ ๋ก try
๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๋ค ์ด์ ๋ก ๊ทธ๋ ๊ฒ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
if err != nil { return err }
๋ ํ๋กํ ํ์ดํํ ๋ ๋ ์ง์ฆ๋๋ ์ ์ ์ ์ธํ๊ณ ๋ try
์ "๋์ค์ ์์ ํ ๊ฒ"๊ณผ ๋์ผํฉ๋๋ค.
ํ ์์ ๊ดํธ ์์ ์๋ ๊ฒ์ด ์์ฉ๊ตฌ์ 4์ค๋ง๋ค ์๋ ํจ์ ๋จ๊ณ๋ณด๋ค ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋น์ ์ด ์ฃผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋น์ ์ ๊ดด๋กญํ๋ ์ด๋ฌํ ํน์ "๋ฌธ์ " ์ค ์ผ๋ถ๋ฅผ ์ง์ ํด ์ฃผ์๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ฐ๋ ์ฑ์ด ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ง๋ง go fmt๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋์ ๋๋๋ก try()๋ฅผ ํ์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
f := try(
os.Open("file.txt")
)
@MrTravisB
๋ด๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ํญ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ๋์ํ์ง ์๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ๊ทธ๊ฒ์ ์ํด ์๊ธฐ๋ฅผ ์ ๋นํํ ๋งํผ ์ถฉ๋ถํ ์์ฃผ ํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ช ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋์ง ์์ต๋๋ค.
์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ค๋ฅด๊ฒ ํ๋ํ๊ณ ์ถ์ ๋.
์ ์์ ์ค๋ฅ์ ๋ธ๋ก ์ ์ฒด ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ํจํด์ ์ค๋ช ํฉ๋๋ค. @josharian ์ ์์ ์ ์ค๋ฅ๊ฐ ์๋ค๊ณ ์ง์ ํ์ง๋ง ์ด๋ฅผ ํผํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ช ๊ฐ์ง ์๋ฅผ ์์ฑํ์ต๋๋ค.
๋ ๊ตฌ์ฒด์ ์ธ ์ค๋ฅ ์ปจํ
์คํธ์ ๊ฒฝ์ฐ ๋ค์ try
๊ฐ ์๋ํ๊ณ ์ด๋ฅผ ์ํ์ง ์์ผ๋ฉด try
๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
@boomlinde ์ ํํ ์ ์์ ์ ๋๋ค. ์ด ์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ธฐ๋ณด๋ค ๋จ์ผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ง์ ํ ๊ฒ์ด ์ ํํ ๋ฌด์์ธ์ง ๊ทผ๋ณธ์ ์ธ ์ง๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ์ ๋น์ ์ด ๊ทธ๊ฒ์ ์ํด ์๊ธฐ๋ฅผ ์ ๋นํํ ๋งํผ ์ถฉ๋ถํ ์์ฃผ ํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ ์๊ฐ๊ณผ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด ์ฌ์ฉ ์ฌ๋ก๋ ์์์ ๋ถ๊ณผํ๋ฉฐ ์๊ธฐ ๊ตฌ๋ฌธ์ ๋ณด์ฆํ์ง ์์ต๋๋ค.
๋ํ defer
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฅํ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ ์ ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. defer
๋ช
์ธ์๋ ์ทจ์ํ ์ ์์ต๋๋ค.
defer fmt.HandleErrorf(&err, โfoobarโ)
n := try(foo())
x : try(foo2())
foo()
vs foo2()
์์ ๋ฐํ๋ ์ ์๋ ์ค๋ฅ์ ๋ํด ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?
@MrTravisB
foo() ๋ foo2()์์ ๋ฐํ๋ ์ ์๋ ์ค๋ฅ์ ๋ํด ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๊ฒ์ด @boomlinde ๊ฐ ๋งํ ์์ ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์์ฃผ ๋ณผ ์๋ ์์ง๋ง ๋ง์ ์ฌ๋๋ค์ด ๋ณด๊ณ ์์ผ๋ฉฐ try
๋ฅผ ์ถ๊ฐํด๋ ์ค์ ๋ก ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ์ค์ ๋ก ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋๋ฌผ์๋ก try
๊ฐ ์ถ๊ฐ๋๋ ์ํฅ์ด ์ ์ต๋๋ค.
@qrpnxz
f := try(os.Open("/foo"))
data := try(ioutil.ReadAll(f))
try(send(data))
(์, ReadFile
๊ฐ ์์ผ๋ฉฐ ์ด ํน์ ์๊ฐ ์์ ์ด ์๋๋ผ ๋ฐ์ดํฐ๋ฅผ ์ด๋๊ฐ์ ๋ณต์ฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค)
try์ ์ธ๋ผ์ธ์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ๋ฏ๋ก ์ฝ๋ ๋ฐ ๋ ๋ง์ ๋
ธ๋ ฅ์ด ํ์ํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ๋
ผ๋ฆฌ๋ ๋ค๋ฅธ ํธ์ถ๋ก ๋ํ๋ฉ๋๋ค.
๋๋ ๋ํ ์ฌ๊ธฐ์ defer
์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ๋ฉ์์ง๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ข์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค... ์ด๊ฒ์ ํ๋ฅญํ์ง๋ง ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ค์ํฉ๋๋ค. ๋ฌด์จ ์ผ์ด ์์๋์ง ์ฝ๋ ์ธ๊ฐ.
Rust์์ ์ ์ด๋ ์ฐ์ฐ์๋ ์ค์ ๋
ผ๋ฆฌ๋ฅผ ํํค์น๋ ๋ฐ ์ถ๊ฐ ๋ถ๋ด์ ์ฃผ์ง ์๋ ์ ๋ฏธ์ฌ( ?
๊ฐ ํธ์ถ ๋์ ์ถ๊ฐ๋จ)์
๋๋ค.
panic
๋ ๋ ๋ค๋ฅธ ํ๋ฆ ์ ์ด ๊ธฐ๋ฅ์ผ ์ ์์ง๋ง ๊ฐ์ ๋ฐํํ์ง ์์ ํจ๊ณผ์ ์ผ๋ก ๋ช
๋ น๋ฌธ์ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ try
์ ๋น๊ตํ์ญ์์ค. ์ด๋ ํํ์์ด๋ฉฐ ์ด๋์์๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
recover
์๋ ๊ฐ์ด ์๊ณ ํ๋ฆ ์ ์ด์ ์ํฅ์ ๋ฏธ์น์ง๋ง defer
๋ฌธ์์ ๋ฐ์ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ defer
๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์ ๋ฆฌํฐ๋ด์ด๊ณ recover
๋ ํ ๋ฒ๋ง ํธ์ถ๋๋ฏ๋ก recover
๋ ํจ๊ณผ์ ์ผ๋ก ๋ช
๋ น๋ฌธ์ผ๋ก ๋ฐ์ํฉ๋๋ค. ๋ค์, ์ด๊ฒ์ ์ด๋์์๋ ๋ฐ์ํ ์ ์๋ try
์ ๋น๊ตํ์ญ์์ค.
๋๋ ๊ทธ ์ ๋ค์ด try
๊ฐ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ง์ ํ ๋ฐ์ ๊ฐ์ด ์ด์ ์ ์์๋ ๋ฐฉ์์ผ๋ก ์ ์ด ํ๋ฆ์ ๋ฐ๋ฅด๋ ๊ฒ์ ์๋นํ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง์ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น๋ฌธ์ ํ์ฉํฉ๋๋ค.
if err != nil {
return nil, 0, err
}
๋ธ๋ก์ return
๋ช
๋ น๋ฌธ์ด ํฌํจ๋์ด ์๊ณ ํด๋น ๋ช
๋ น๋ฌธ์ด ๊ฐํ ๋ฌธ์๋ฅผ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ gofmt
์ ์ํด ํ ํ์ ํ์์ด ์ง์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
if err != nil { return nil, 0, err }
gofmt
๋ ๊ฐํ์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ(๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ๊ฐ์ด) ์ ์งํ๋ ์์น์์ ์ ํํ๋๋ก ๊ท์น์ ์ค๊ณํ ์ ์์ต๋๋ค. ์ตํธ์ธ์ ํตํด ์์ฑ์๋ ์ผ๋ถ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์กฐํ ์๋ ์์ต๋๋ค.gofmt
๋ฅผ ํธ์ถํ์ฌ ์ฝ๋๋ฅผ ์ ์คํ์ผ๋ก ์๋ ์ด์ํ ์ ์์ต๋๋ค.return
๊ตฌ๋ฌธ์๋ง ํด๋นํ๋ฏ๋ก ๋ถํ์ํ๊ฒ ๊ณจํ ์ฝ๋์ ๋จ์ฉ๋์ง ์์ต๋๋ค.try
ํํ์์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํฉ๋๋ค.try
๋ ์์ฑ์์๊ฒ ๋ ๋ง์ด ๊ธฐ์ธ์
๋๋ค.try
์ ์ ์ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ์ฃผ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์คํ์ผ์ ์๊ฐํ๋ ์ด ์ฃผ์f, err := os.Open(file)
try(maybeWrap(err))
err
๊ฐ์ ๋ํ ๋ชจํธ์ฑ์ ์ ๊ฑฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ํ์์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง ์์๊น ์๊ฐํฉ๋๋ค. ๋ฐํ ๊ฐ์ด ๋ฌด์์ธ์ง ๋ช
์ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ธ๋ก์ด ๊ฑฐ์ ๋์ผํ ๊ฒฝ์ฐ ํ ์ค๋ก ํ์ฉdefer
๊ธฐ๋ฐ ๋ํ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋ ๋ค ์ค๋ฅ ๋ํ์ ๋ํ ์ฅ๋ฒฝ์ ๋์ด๊ณ ์ ์๋ godoc
๋ณ๊ฒฝ์ด ํ์ํ ์ ์์ต๋๋ค.try
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ธฐ์กด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋ํด ๋
ผ์ํ ํ์๊ฐ ์์ต๋๋ค.try
๋๋ ๋ค๋ฅธ ์ผ์ ํ๋ ๊ฒ์ ๊ธ์งํ์ง ์์ต๋๋ค. try
์ด ์๋ฝ๋๋๋ผ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธ์ ์ ์ผ ์ ์์ต๋๋ค.testing
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ main
ํจ์์ ๋ถ์ ์ ์ธ ์ํธ ์์ฉ์ด ์์ต๋๋ค. ์ค์ ๋ก ์ ์์๊ฐ ๋ฐํ ๋์ ํ ์ค๋ก ๋ ๋ช
๋ น๋ฌธ์ ํ์ฉํ๋ ๊ฒฝ์ฐ ์ฃผ์ฅ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์ค์ผ ์ ์์ต๋๋ค. ๊ณ ๋ คํ๋คvalue, err := something()
if err != nil { t.Fatal(err) }
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }
์์ฝํ๋ฉด ์ด ์ ์์ ๋น์ฉ์ด ์ ๊ฒ ๋ค๊ณ ์ ํํ๋๋ก ์ค๊ณํ ์ ์์ผ๋ฉฐ ์คํ์ผ๋ง ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ๋ณ๊ฒฝ์ ๋ฐฐ์ ํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ ๋ช
์์ ์ผ๋ก ์ ์งํ๋ฉด์ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ฝ๋ ๊ณ ํต์ ์ค์
๋๋ค. try
์ ์ฌ์ธํ๊ธฐ ์ ์ ์ต์ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ก ๊ณ ๋ ค๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์๋ ๋ช ๊ฐ์ง ์
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
try(dbfile.RunMigrations(db, dbMigrations))
t := &Thing{
thingy: thingy,
scanner: try(newScanner(thingy, db, client)),
}
t.initOtherThing()
return t, nil
}
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
err := dbfile.RunMigrations(db, dbMigrations))
if err != nil { return nil, fmt.Errorf("running migrations: %v", err) }
t := &Thing{thingy: thingy}
t.scanner, err = newScanner(thingy, db, client)
if err != nil { return nil, fmt.Errorf("creating scanner: %v", err) }
t.initOtherThing()
return t, nil
}
์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋์์ ๊ณต๊ฐ ์ฌ์ฉ์์ ๊ฒฝ์๋ ฅ์ด ์์ต๋๋ค.
func (c *Config) Build() error {
pkgPath := try(c.load())
b := bytes.NewBuffer(nil)
try(emplates.ExecuteTemplate(b, "main", c))
buf := try(format.Source(b.Bytes()))
target := fmt.Sprintf("%s.go", filename(pkgPath))
try(ioutil.WriteFile(target, buf, 0644))
// ...
}
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil { return nil, errors.WithMessage(err, "load config dir") }
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err != nil { return nil, errors.WithMessage(err, "execute main template") }
buf, err := format.Source(b.Bytes())
if err != nil { return nil, errors.WithMessage(err, "format main template") }
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
// ...
}
์๋ ๋๊ธ์ ๊ฐ์์ tryf
๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ฒจ๋ถํ์ง๋ง ์ ๊ฑฐ๋์์ต๋๋ค. ๋ชจ๋ ๊ณ ์ ํ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ถ๋ถ๋ช
ํ๋ฉฐ ์๋ง๋ try
๋ ์ ์ฉ๋์ง ์์ ๊ฒ์
๋๋ค.
@cpuguy83
๋์๊ฒ ๊ทธ๊ฒ์ try
๋ก ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ์ด ์์์๋ "ํ์ผ ์ด๊ธฐ, ๋ชจ๋ ๋ฐ์ดํธ ์ฝ๊ธฐ, ๋ฐ์ดํฐ ๋ณด๋ด๊ธฐ"๋ฅผ ์ฝ์ต๋๋ค. ์ผ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด "ํ์ผ์ ์ด๊ณ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ด๋ฅผ ์ํํ ๋ค์ ๋ชจ๋ ๋ฐ์ดํธ๋ฅผ ์ฝ๊ณ ์ด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํฉ๋๋ค..."๋ผ๊ณ ์ฝ์ต๋๋ค. err != nil
๋ฅผ ํตํด ์ค์บํ ์ ์์ต๋๋ค. try
๊ฐ ๋ ์ฝ์ต๋๋ค. ์๋ํ๋ฉด ๋ด๊ฐ ๋ณผ ๋ ์ฆ์ ํ๋์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. err != nil์ ๋ฐํํฉ๋๋ค. ์ง์ ์ด ์๋ค๋ฉด ๊ทธ ์ง์ ์ด ๋ฌด์์ ํ๋์ง ๋ด์ผ ํฉ๋๋ค. ๋ฌด์์ด๋ ํ ์ ์์ต๋๋ค.
๋๋ ๋ํ ์ฌ๊ธฐ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๋ฉ์์ง๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ข์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค.
์ฐ๊ธฐํ ๋ ํ ์ ์๋ ๋ค๋ฅธ ์ผ์ด ์์ ๊ฑฐ๋ผ๊ณ ํ์ ํ์ง๋ง, ์ด์จ๋ try
๋ ๊ฐ๋จํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค. ๋ ๋ง์ ์์
์ ์ํํ๊ณ ์ถ์ ๋๋ง๋ค ํญ์ ์ข์ ol' Go ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ๋ผ์ง์ง ์์ ๊ฒ์
๋๋ค.
@zeebo ๋ค, ์ ๋ ๊ทธ๊ฒ์ ๋น ์ ธ์์ต๋๋ค.
@kungfusheep ์ ๊ธฐ์ฌ๋ ๊ทธ๋ฐ ํ ์ค ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ ๊ทธ๊ฒ์ ์๋ํ๊ธฐ ์ํด ์ข
๋ฃํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ฅํ์๋ง์ gofmt์์ ์ฌํ๋ ์ธ ์ค๋ก ํ์ฅํ์ต๋๋ค. stdlib์ ๋ง์ ๊ธฐ๋ฅ์ด ์ด์ ๊ฐ์ด ํ ์ค์ ์ ์๋์ด ์์ผ๋ฏ๋ก gofmt๊ฐ ์ด๋ฅผ ํ์ฅํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ๋๋์ต๋๋ค.
@qrpnxz
๋๋ ๋ง์ go ์ฝ๋๋ฅผ ์ฝ๋๋ค. ์ด ์ธ์ด์ ๊ฐ์ฅ ์ข์ ์ ์ค ํ๋๋ ํน์ ์คํ์ผ์ ๋ฐ๋ฅด๋ ๋๋ถ๋ถ์ ์ฝ๋์์ ์ฝ๊ฒ ์ป์ ์ ์๋ค๋ ๊ฒ์
๋๋ค(gofmt์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค).
try(f())
๋ก ๋ํ๋ ๋ง์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ถ์ง ์์ต๋๋ค .
์ด๊ฒ์ ์ฝ๋ ์คํ์ผ/์ค์ต์ ์ฐจ์ด๊ฐ ์๊ฑฐ๋ "์ค, ์ฌ๊ธฐ์ try()
๋ฅผ ์ฌ์ฉํ์ด์ผ ํ์ต๋๋ค"์ ๊ฐ์ ๋ฆฐํฐ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ์ด ์ ์์ ๋ํด).
๊ฐ๊ด์ ์ผ๋ก if err != nil { return err }
๋ณด๋ค๋ ๋ซ์ง ์๊ณ , ํ์ดํ์ด ๋ํ ๋ฟ์
๋๋ค.
๋ง์ง๋ง ํ๊ฐ์ง:
๋น์ ์ด ์ ์์ ์ฝ์ผ๋ฉด ๋น์ ์ ๋ฐฉํดํ๋ ๊ฒ์ด ์๋ฌด๊ฒ๋ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ ๋ง์ ์ผ๊ฐํด ์ฃผ์ญ์์ค. ๋ฌผ๋ก ์ ์์๋ฅผ ์ฝ์์ต๋๋ค. ์ด์ ฏ๋ฐค์ ๊ทธ๊ฒ์ ์ฝ๊ณ ์ค๋ ์์นจ์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ํ ๋๊ธ์ ๋ฌ์๊ณ ๋ด๊ฐ ์๋ํ ๊ฒ์ ์ธ๋ถ ์ฌํญ์ ์ค๋ช
ํ์ง ์์์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ ๋์ ์ธ ์์์
๋๋ค.
@cpuguy83
๋ด ๋์ CPU ๋
์. ๊ทธ๋ฐ ๋ป์ด ์๋์์ด์.
๊ทธ๋ฆฌ๊ณ try
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ๊ทธ๋ ์ง ์์ ์ฝ๋์ ์๋นํ ๋ค๋ฅด๊ฒ ๋ณด์ผ ๊ฒ์ด๋ผ๋ ์ ์ ์ง์ ํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ด ํด๋น ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ๋ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ์ง๋ง ์ ๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์ข์ํ๋ ๊ฒ์ฒ๋ผ ๋น์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ข์ํ์ง ์๋๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. Go์ ๋ง์ ๊ฒ๋ค์ด ๊ทธ๋ฐ ์์
๋๋ค. ๋ฆฐํฐ๊ฐ ๋น์ ์๊ฒ ๋ฌด์์ ํ๋ผ๊ณ ๋งํ๋์ง๋ ์์ ํ ๋ค๋ฅธ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก ๊ฐ๊ด์ ์ผ๋ก ๋ ๋์ ๊ฒ์ ์๋๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋์๊ฒ ๋ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ํํํ๊ณ ์์๋ค . ๋๋ ๊ทธ๊ฒ์ ์กฐ์ฌ์ค๋ฝ๊ฒ ๋งํ๋ค.
๋ค์ ํ ๋ฒ ๋ง์๋๋ฆฌ์ง๋ง ์ฃ์กํฉ๋๋ค. ๋น๋ก ์ด๊ฒ์ด ๋ ผ์์ด์ง๋ง ๋น์ ์ ์ ๋์ํ ์๋๋ ์์์ต๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -498908380
์๋ฌด๋ ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ป๋ปํจ์ ๋ฌด์ํ๊ณ , ๋์์ธ ๋นํ์ ๋ฌด์ํ๋ ๊ฝค ์์ ๋์ ์ฅ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก , ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ๋์ ํจ๊ป ์ฝ๋๋ฅผ ์์ฑํ๋ ์ฌ๋์ ๋๊ตฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์๊ณ ๋์๊ฒ try(try(try(to()).parse().this)).easily())
ํด๋
์ ์๋ํ ์ ์์ต๋๋ค. ๋ผ๊ณ ๋งํ๋๋ฏ
์๋ฌด๋ ๋น์ ์ด ๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค{}.
์ด์จ๋ Go๋ ๋จ์์ฑ์ ๋ํด ๋งค์ฐ ์๊ฒฉํฉ๋๋ค. gofmt
๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณด์ด๊ฒ ํฉ๋๋ค. ํ๋ณตํ ๊ธธ์ ์ผ์ชฝ์ ์ ์งํ๊ณ ๋น์ธ๊ฑฐ๋ ๋๋ ์ ์๋ ๊ฒ์ ๋ฌด์์ด๋ ๋ช
์์ ์
๋๋ค. ์ ์๋ try
๋ ์ด๊ฒ์์ 180๋ ํ์ ํฉ๋๋ค. ๋จ์ํจ != ๊ฐ๊ฒฐํจ.
์ต์ํ try
๋ lvalue๊ฐ ์๋ ํค์๋์ฌ์ผ ํฉ๋๋ค.
if err != nil { return err }
๋ณด๋ค _๊ฐ๊ด์ ์ผ๋ก_ ์ข์ง ์์ต๋๋ค. ๋ค๋ง ์ ๋ ฅํ๋ ๊ฒ์ด ์ ์ต๋๋ค.
๋ ์ฌ์ด์๋ ํ ๊ฐ์ง ๊ฐ๊ด์ ์ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค. try(Foo())
๋ ํํ์์
๋๋ค. ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๊ทธ ์ฐจ์ด๊ฐ ๋จ์ ์
๋๋ค( try(strconv.Atoi(x))+try(strconv.Atoi(y))
๋นํ). ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๊ทธ ์ฐจ์ด๊ฐ ๊ฑฐ์ ๊ฐ์ ์ด์ ๋ก ์ฅ์ ์
๋๋ค. ์ฌ์ ํ ๊ฐ๊ด์ ์ผ๋ก ๋ ์ข๊ฑฐ๋ ๋์์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ ์ฐจ์ด๊ฐ ์ํ์ ์๋์์ ํฉ์ธ๋ ค์ผ ํ๊ณ ๊ทธ๊ฒ์ด "๊ทธ์ ํ์ดํ์ ๋ ํ๋ค"๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ด ์ ์์ ์ ๋นํํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@elagergren-spideroak try
๋ ํ ์จ์ ๋ณด๊ธฐ์ ์ง์ฆ๋๊ณ ๋ค์ ์จ์๋ ๋ช
์์ ์ด์ง ์๋ค๊ณ ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋น์ ์ ํ๋๋ฅผ ์ ํํด์ผํฉ๋๋ค.
ํจ์ ์ธ์๊ฐ ์์ ๋ณ์์ ๋จผ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๋ ํํ๊ฒ ๋ณผ ์ ์์ ๊ฒ ๊ฐ์์
this := try(to()).parse().this
that := try(this.easily())
๋น์ ์ ์๋ณด๋ค.
try
์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ์ด ํ๋ณตํ ๊ฒฝ๋ก์ด๋ฏ๋ก ์์๋๋ก ๋ณด์
๋๋ค. ๋ถํํ ๊ธธ์์๋ ๋์์ค๋ ๊ฒ๋ฟ์
๋๋ค. try
์ด ์๋ ๊ฒ์ ๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ํด๋น ์ ๋ณด๋ฅผ ์์งํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ํจ์์์ ๋ฐํํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒ๋ ์๋๋ฏ๋ก ํด๋น ์ค๋ช
์์ try
๊ฐ 180
@josharian https://github.com/golang/go/issues/32437#issuecomment -498941854 ์ ๋ํ ๊ทํ์ ์๊ฒฌ๊ณผ ๊ด๋ จํ์ฌ ์ฌ๊ธฐ์ ์ด๊ธฐ ํ๊ฐ ์ค๋ฅ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
defer fmt.HandleErrorf(&err, "foobar: %v", err)
err
์ ์ ๋ฌ๋๊ณ HandleErrorf
err
๋ํ ํฌ์ธํฐ๊ฐ ์ ๋ฌ๋ฉ๋๋ค. err
๊ฐ nil
์ธ์ง ํ์ธํฉ๋๋ค(ํฌ์ธํฐ ์ฌ์ฉ). ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ err
์ ์์ ๋์ง ์์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ํ์์ ์ง์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ err
๋ฅผ ํ์ํ๋ ์ค๋ฅ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
@Merovius ์ ์์ ์ค์ ๋ก ๊ตฌ๋ฌธ ์คํ ๋งคํฌ๋ก ์ผ๋ฟ์ด๋ฏ๋ก ์ฌ๋๋ค์ด ์๊ฐํ๋ ๊ฒ์ด ๋ ๋ฉ์ง๊ฒ ๋ณด์ด๊ฑฐ๋ ์ต์ํ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์๋๋ผ๊ณ ์๊ฐ๋์๋ฉด ์ ์๊ฒ ์ค๋ช ํด ์ฃผ์ญ์์ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก ์ฐฌ์ฑํฉ๋๋ค. ๋ด ๊ด์ ์์ ํค์๋๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ ๋ฉ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค.
@ianlancetaylor , @josharian ์ด ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค. err
defer
๊ฐ ์คํ์ ํธ์๋ ๋์ ๊ฐ์ด์ง, err
์ (์๋ง๋ ์๋๋) ๊ฐ์ด ์๋๋๋ค. try
์ ์ํด ์ค์ ๋์ด ๋ฐํ๋ฉ๋๋ค.
try
์ ๋ํ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ฌ๋๋ค์ด ํ ์ค์ ๋ ๋ง์ ๋
ผ๋ฆฌ์ ๋
ผ๋ฆฌ๋ฅผ ๋ฒ๋ฆฌ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ธ์ด์ ๋ํ ๋์ ์ฃผ์ ๋ฌธ์ ์
๋๋ค. ํ ์ค์ 5๊ฐ์ ํํ์์ ์
๋ ฅํ๋ ๊ฒ์ด ์ ๋ง ์ฝ์ต๋๋ค.
this := try(to()).parse().this
that := try(this.easily())
^^ ์ด๋ง์ ๋ ๋์ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์ ๋จธ๋ฆฌ ์์์ paren ๋งค์นญ์ ํ๋ฉด์ ์๋ค๋ก ์ ํํด์ผ ํฉ๋๋ค. ์ค์ ๋ก๋ ์์ฃผ ๊ฐ๋จํ ๋ ๋ฒ์งธ ์ค๋... ์ฝ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต์ต๋๋ค.
์ค์ฒฉ๋ ํจ์๋ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค.
parser, err := to()
if err != nil {
return err
}
this := parser.parse().this
that, err := this.easily()
if err != nil {
return err
}
^^ ์ด๊ฒ์ ํจ์ฌ ๋ ์ฝ๊ณ ๋ ๋์ IMO์ ๋๋ค. ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋ช ํํฉ๋๋ค. ์, ํจ์ฌ ๋ ๋ง์ ์ฝ๋ ๋ผ์ธ์ด ์์ต๋๋ค. ์ ๋ ์๊ดํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋งค์ฐ ๋ถ๋ช ํฉ๋๋ค.
@bcmills @josharian ์ ๋ฌผ๋ก ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ์์ด์ผํฉ๋๋ค
defer func() { fmt.HandleErrorf(&err, โfoobar: %vโ, err) }()
๊ทธ๋ ๊ฒ ์ข์ง ์์ต๋๋ค. ์๋ง๋ fmt.HandleErrorf
๋ ์์์ ์ผ๋ก ์ค๋ฅ ๊ฐ์ ๋ง์ง๋ง ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ๋ง์ ๋๊ธ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์๊ณ ๊ทธ ์ค ์๋น์๋ ์ด๋ฏธ ์์ฑ๋ ๋๊ธ์ ๋ฐ๋ณตํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ๋๊ธ์ ์์ ๋กญ๊ฒ ๋ง์๋๋ฆฌ์ง๋ง, ์ด๋ฏธ ์ง์ ํ ๋ถ๋ถ์ ๋ค์ ์ธ๊ธํ๊ณ ์ถ์ผ์๋ค๋ฉด ์์ ์ ๋ฐ๋ณตํ๋ ๊ฒ๋ณด๋ค GitHub์ ์ด๋ชจํฐ์ฝ์ ์ฌ์ฉํ์ฌ ๋ค์ ๋ง์ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๊ฐ์ฌ ํด์.
@ianlancetaylor fmt.HandleErrorf
๊ฐ ํ์ ํ ์ฒซ ๋ฒ์งธ ์ธ์๋ก err์ ๋ณด๋ด๋ฉด ๊ตฌํ์ด ๋ ์ข์์ง๊ณ ์ฌ์ฉ์๋ ํญ์ %[1]v
๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
@natefinch ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
๋ฌ์คํธ ์คํ์ผ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋ง์์์ง ๊ถ๊ธํฉ๋๋ค.
์๊ฐ๋ง ํ๋ ์ ์์ ์๋๋ ์ฐธ๊ณ ํ์ธ์...
this := to()?.parse().this
that := this.easily()?
๊ฒฐ๊ตญ ๋๋ ์ด๊ฒ์ด ๋ ์ข๋ค๊ณ ์๊ฐํ์ง๋ง ( !
๋๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค...), ์ฌ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
๋ฌผ๋ก Rust์๋ try()
๊ฐ ์์ต๋๋ค. ํ์ง๋ง... ๋ค๋ฅธ Rust ์คํ์ผ์
๋๋ค.
if err != nil { return err }
๋ณด๋ค _๊ฐ๊ด์ ์ผ๋ก_ ์ข์ง ์์ต๋๋ค. ๋ค๋ง ์ ๋ ฅํ๋ ๊ฒ์ด ์ ์ต๋๋ค.๋ ์ฌ์ด์๋ ํ ๊ฐ์ง ๊ฐ๊ด์ ์ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
try(Foo())
๋ ํํ์์ ๋๋ค. ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๊ทธ ์ฐจ์ด๊ฐ ๋จ์ ์ ๋๋ค(try(strconv.Atoi(x))+try(strconv.Atoi(y))
๋นํ). ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๊ทธ ์ฐจ์ด๊ฐ ๊ฑฐ์ ๊ฐ์ ์ด์ ๋ก ์ฅ์ ์ ๋๋ค. ์ฌ์ ํ ๊ฐ๊ด์ ์ผ๋ก ๋ ์ข๊ฑฐ๋ ๋์์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ ์ฐจ์ด๊ฐ ์ํ์ ์๋์์ ํฉ์ธ๋ ค์ผ ํ๊ณ ๊ทธ๊ฒ์ด "๊ทธ์ ํ์ดํ์ ๋ ํ๋ค"๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ด ์ ์์ ์ ๋นํํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ด ๊ตฌ๋ฌธ์ ์ข์ํ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋์ ๋๋ค. ๋ชจ๋ ์ค๊ฐ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ ํ์ ์์ด ๋ ํฐ ํํ์์ ์ผ๋ถ๋ก ์ค๋ฅ ๋ฐํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค ์ํฉ์์๋ ์ด๋ฆ์ ์ง๋ ๊ฒ์ด ์ฝ์ง๋ง ์ด๋ค ์ํฉ์์๋ ํน๋ณํ ์๋ฏธ๊ฐ ์๊ฑฐ๋ ์ค๋ณต๋์ง ์๋ ์ด๋ฆ์ ์ง์ ํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ด๋ฆ์ ์์ ์ง์ ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
@MrTravisB
์ ํํ ๋ด ์์ . ์ด ์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ธฐ๋ณด๋ค ๋จ์ผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ง์ ํ ๊ฒ์ด ์ ํํ ๋ฌด์์ธ์ง ๊ทผ๋ณธ์ ์ธ ์ง๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ ๊ฒ์ด ์ ํํ ๋น์ ์ ์์ ์ ๋๊น? ์คํ๋ ค ์ฐ๋ฆฌ๊ฐ ๋์ํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ๋ด ๋ง์ ๊ทผ๋ณธ์ ์ผ๋ก ์๋ชป ์ดํดํ์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์๊ฐ๊ณผ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด ์ฌ์ฉ ์ฌ๋ก๋ ์์์ ๋ถ๊ณผํ๋ฉฐ ์๊ธฐ ๊ตฌ๋ฌธ์ ๋ณด์ฆํ์ง ์์ต๋๋ค.
Go ์์ค์๋ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ ๋ฐฉ๋ฒ์ด ์๋๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก try
๋ก ์ฒ๋ฆฌํ ์ ์๋ ์์ฒ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ฒฝ๋ฏธํ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ์ผ๋ฐ์ ์ธ ๋ถ๋ง ์ฌํญ์
๋๋ค.
๋ํ defer๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฅํ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ ์ ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. defer ๋ฌธ์ ์ทจ์ํ ์ ์์ต๋๋ค.
์ ์ฌํ๊ฒ, ์ฐ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด +๋ฅผ ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋บ์ ์ ์ํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก ์ํ์ง ์๋ ๊ฒฝ์ฐ ํ์ง ์์ต๋๋ค. ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ ๋ธ๋ก ์ ์ฒด์ ์ค๋ฅ ์ปจํ ์คํธ๊ฐ ์ต์ํ ๊ณตํต ํจํด์ ๋ํ๋ด๋์ง ์ฌ๋ถ์ ๋๋ค.
foo() ๋ foo2()์์ ๋ฐํ๋ ์ ์๋ ์ค๋ฅ์ ๋ํด ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?
๋ค์ ๋งํ์ง๋ง try
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด try
์์ ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ์ง๋ง ์์ ๊ฒ๋ ์์ต๋๋ค.
@cpuguy83
๋ฌ์คํธ ์คํ์ผ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๋ง์์์ง ๊ถ๊ธํฉ๋๋ค.
์ ์์ ์ด์ ๋ํ ์ฃผ์ฅ์ ์ ์ํฉ๋๋ค.
์ด ์์ ์์ try{}catch{}
๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.upside_down_face:
defer
์ฝ๋ ์ผ์ด์ค๋ฅผ ๋๊ธฐ ์ํด ๋ช
๋ช
๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ godoc๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋์ฐํ ๋ฟ๋ง ์๋๋ผ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋งค์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค๋ฅธ func()
๋ก ๋ชจ๋ ๊ฒ์ ํฌ์ฅํ ์ ์๋ค๋ ์ ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ๋ช
์ฌํด์ผ ํ ๋ ๋ง์ ๊ฒ๋ค์
๋๋ค. ์ ์๊ฐ์๋ ๊ทธ๊ฒ์ด "๋์ ์ต๊ด"์ ์กฐ์ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค.์๋ฌด๋ ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด ์ข์ ์๋ฃจ์ ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค. ํ์ฌ ์์ด๋์ด์ ๋์์ธ์ ๊ฒฐํจ์ด ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์์ผ๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๋ฐฉ์์ผ๋ก ํด๊ฒฐ๋๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
try(try(try(to()).parse().this)).easily())
์ ๊ฐ์ ์์ ๋ ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ์ํํ ์ ์์ผ๋ฉฐ ์ฝ๋๋ฅผ ๊ฒํ ํ๋ ์ฌ๋๋ค์ด ๋ถํ ์ ์์ฒญํ๋ ๊ฒ์ด ๊ณต์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ณณ์ด 3๊ณณ์ด๊ณ ๊ฐ ๊ณณ์ ๊ฐ๋ณ์ ์ผ๋ก ํฌ์ฅํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? try()
๋ ์ด๊ฒ์ ๋งค์ฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ฌ์ค try()
๋ ์ด๋ฏธ ๊ทธ ์ด๋ ค์์ ๊ฐ์ํ ๋ ๋ํ ์ค๋ฅ๋ฅผ ๊ถ์ฅํ์ง ์์ง๋ง ๋ค์์ ์ ๊ฐ ์๋ฏธํ๋ ๋ฐ์ ์์
๋๋ค.
func before() error {
x, err := foo()
if err != nil {
wrap(err, "error on foo")
}
y, err := bar(x)
if err != nil {
wrapf(err, "error on bar with x=%v", x)
}
fmt.Println(y)
return nil
}
func after() (err error) {
defer fmt.HandleErrorf(&err, "something failed but I don't know where: %v", err)
x := try(foo())
y := try(bar(x))
fmt.Println(y)
return nil
}
๋ค์ ๋งํ์ง๋ง
try
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉดtry
์์ ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ์ง๋ง ์์ ๊ฒ๋ ์์ต๋๋ค.
์ ์ฉํ ์ปจํ
์คํธ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ด ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. try()
๋ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ฆ, try()
๋ ์๋ฌด๋ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ ๋๋ฌด ๋๋ฌผ๊ฒ ์ฌ์ฉ๋์ด ์กด์ฌํ์ง ์์์ ์๋ ์๋ ๊ธฐ๋ฅ์ด ๋ฉ๋๋ค.
๊ทธ๋ฅ "๊ธ์, ์ซ์ผ๋ฉด ์ฐ์ง ๋ง๊ณ ๋ฅ์ณ"(์ด๋ฐ ์์ผ๋ก ์ฝํ๋ค)๋ผ๊ณ ๋งํ๋ ๊ฒ๋ณด๋ค, ๋ง์ ์ฌ์ฉ์ด ๊ฒฐํจ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์๋ ๋ถ๋ถ์ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ๋ค. ๋์์ธ์. ๋์ ์ฐ๋ฆฌ์ ๊ด์ฌ์ฌ๊ฐ ๋ ๋์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ์ ์๋ ์ค๊ณ์์ ์์ ํ ์ ์๋ ์ฌํญ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๊น?
@boomlinde ์ฐ๋ฆฌ๊ฐ ๋์ํ๋ ์์ ์ ์ด ์ ์์ด ์ฌ์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ค๋ ๊ฒ์ด๋ฉฐ "ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ๋ง์ญ์์ค"๋ผ๋ ์ฌ์ค์ด ๊ทธ ์์ ์ ๋์ฑ ๋ฐ์ ์ํค๋ ์ฃผ์ ์ฃผ์ฅ์ด๋ผ๋ ๊ฒ์ ๋๋ค. @elagergren-spideroak์ด ๋งํ๋ฏ์ด ๊ทธ ์ฃผ์ฅ์ ์๋ํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋๋ผ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋๋ก ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋น์ ์ ์ฃผ์ฅ์ ๋ ผ๋ฆฌ์ ๋ฐ๋ฅด๋ฉด Go๋ ๋ํ ์ผํญ๋ฌธ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผํญ๋ฌธ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
๋ฉด์ฑ ์กฐํญ - Go์๋ ์ผํญ๋ฌธ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง Go์ ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ ๋์ ํ์ง ์๋ ๊ฒ์ ๋๋ค.
๋์๊ฒ ๋ ๋ค๋ฅธ ์ผ์ด ๋ฐ์ํฉ๋๋ค. try
๊ฐ ์์ผ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฅผ ๋ถ์ฃผ์ํ๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋ถ์ถ๊ธธ ์ ์๋ค๋ ์๊ฐ์ ๊ธฐ๋ฐํ ๋ง์ ๋นํ์ ๋ณด๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๊ฐ์๋ ์ด๊ฒ์ด ํ์ฌ์ ์ธ์ด์ ๋ ์ ํฉํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ๋ ์ถฉ๋ถํ ์ฑ๊ฐ์ ๋๋จธ์ง ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด ์ผ๋ถ ์ค๋ฅ๋ฅผ ์ผํค๊ฑฐ๋ ๋ฌด์ํ๋๋ก ๋ถ์ถ๊น๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ฒ ์ผ์ต๋๋ค.
func exists(filename string) bool {
_, err := os.Stat(filename)
return err == nil
}
if exists(...) { ... }
๋ฅผ ์์ฑํ ์ ์๋๋ก ์ด ์ฝ๋๊ฐ ์ผ๋ถ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ๋ฌด์ํ๋๋ผ๋. try
๊ฐ ์์๋ค๋ฉด ์๋ง๋ ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ (bool, error)
๋ฅผ ๋ฐํํ์ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์์ ํผ๋์ค๋ฌ์์ catch๋ผ๋ ๋ ๋ฒ์งธ ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ๋ ์์ด๋์ด๋ฅผ ๋์ง ๊ฒ์
๋๋ค catch
๋ ์ค๋ฅ๋ฅผ ๋ฐ์ ๋ฎ์ด์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์์ ํ ๋ค์ ํ์ catch
ํธ๋ค๋ฌ๋ฅผ ๋ฎ์ด์๋๋ค. ์๋ฅผ ๋ค์ด:
func catch(handler func(err error) error) {
// .. impl ..
}
์ด์ ์ด ๋ด์ฅ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด try
์์ ๋ฐํ๋ ๋ค์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋งคํฌ๋ก์ ์ ์ฌํ ํจ์์ด๊ธฐ๋ ํฉ๋๋ค.
func wrapf(format string, ...values interface{}) func(err error) error {
// user defined
return func(err error) error {
return fmt.Errorf(format + ": %v", ...append(values, err))
}
}
func sample() {
catch(wrapf("something failed in foo"))
try(foo()) // "something failed in foo: <error>"
x := try(foo2()) // "something failed in foo: <error>"
// Subsequent calls for catch overwrite the handler
catch(wrapf("something failed in bar with x=%v", x))
try(bar(x)) // "something failed in bar with x=-1: <error>"
}
์ด๊ฒ์ ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ํจ์๋ก ๋ํํ์ง ์๋ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด defer
์์ด ์ค๋ฅ๋ฅผ ๋ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. ๋ํ defer
๊ฐ ๋ด๊ฐ ๊ทธ๋ค ์ค 2๊ฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ์ด๋ ๋ชจ๋ ์ค๋ฅ. ์๋ฅผ ๋ค์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ๋๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
func foo(a, b string) (int64, error) {
return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func withContext(a, b string) (int64, error) {
catch(func (err error) error {
return fmt.Errorf("can't parse a: %s, b: %s, err: %v", a, b, err)
})
return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func moreExplicitContext(a, b string) (int64, error) {
catch(func (err error) error {
return fmt.Errorf("can't parse a: %s, err: %v", a, err)
})
x := try(strconv.Atoi(a))
catch(func (err error) error {
return fmt.Errorf("can't parse b: %s, err: %v", b, err)
})
y := try(strconv.Atoi(b))
return x + y
}
func withHelperWrapf(a, b string) (int64, error) {
catch(wrapf("can't parse a: %s", a))
x := try(strconv.Atoi(a))
catch(wrapf("can't parse b: %s", b))
y := try(strconv.Atoi(b))
return x + y
}
func before(a, b string) (int64, error) {
x, err := strconv.Atoi(a)
if err != nil {
return 0, fmt.Errorf("can't parse a: %s, err: %v", a, err)
}
y, err := strconv.Atoi(b)
if err != nil {
return 0, fmt.Errorf("can't parse b: %s, err: %v", b, err)
}
return x + y
}
๊ทธ๋ฆฌ๊ณ ์ฌ์ ํ ํผ๋์ค๋ฌ์ด ๋ถ์๊ธฐ์ ์์ต๋๋ค(๊ณต๊ฐํ๋๋ก ๋๊ธฐ ์ํด) catch
๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
์ด์ ... ๋ง์ง๋ง ๋ฌธ์ฅ์ ์๋ฏธํ์ง๋ ์์ง๋ง ํ ๋ก ์ ๋์์ด ๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๋งค์ฐ ๊ณต๊ฒฉ์ ์ธ IMO์
๋๋ค.
๊ทธ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ๊ธธ์ ๊ฐ๋ค๋ฉด try{}catch(error err){}
๋ฅผ ๊ฐ์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค :stuck_out_tongue:
#27519 - #id/catch ์ค๋ฅ ๋ชจ๋ธ๋ ์ฐธ์กฐํ์ญ์์ค.
์๋ฌด๋ ์๋๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ป๋ปํจ์ ๋ฌด์ํ๊ณ , ๋์์ธ ๋นํ์ ๋ฌด์ํ๋ ๊ฝค ์์ ๋์ ์ฅ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. glib๋ ์ ์๋๊ฐ ์๋์์ต๋๋ค.
๋ด๊ฐ ๋งํ๋ ค๋ ๊ฒ์ try
์ด 100% ์๋ฃจ์
์ด ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. try
์์ ์ ์ฒ๋ฆฌ๋์ง ์๋ ๋ค์ํ ์ค๋ฅ ์ฒ๋ฆฌ ํจ๋ฌ๋ค์์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํธ์ถ ์ฌ์ดํธ ์ข
์ ์ปจํ
์คํธ๋ฅผ ์ค๋ฅ์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ ๋ณต์กํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ธ์ ๋ ์ง if err != nil {
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
try
๊ฐ X์ ๋ค์ํ ์ธ์คํด์ค์ ๋ํด X๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ํ์คํ ์ ํจํ ์ฃผ์ฅ์
๋๋ค. ๊ทธ๋ฌ๋ ์ข
์ข
๊ฒฝ์ฐ X๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฉ์ปค๋์ฆ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ ์์ผ๋ก X๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ํ ๋ฉ์ปค๋์ฆ์ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ ์ถฉ์ ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ X๊ฐ ์ผ๋ง๋ ํํ์ง, ๊ทธ๋ฆฌ๊ณ X๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์ผ๋ง๋ ๋ง์ ๋ณต์ก์ฑ์ด ํ์ํ์ง์ ๋ฌ๋ ค ์์ต๋๋ค.
๊ทธ๋์ "์๋ฌด๋ ๋น์ ์ ์๋ํ๊ฒ ๋ง๋ค์ง ์์ ๊ฒ์
๋๋ค"๋ผ๋ ๋ง์ ๋ฌธ์ ์ ์๊ฐ 90%๊ฐ ์๋๋ผ 10%์ ์๋ค๊ณ ์๊ฐํ๋ค๋ ์๋ฏธ์
๋๋ค. ๊ทธ ์ฃผ์ฅ์ ํ์คํ ๋
ผ์์ ์ฌ์ง๊ฐ ์์ผ๋ฉฐ ๋๋ ๋ฐ๋ก ์ ๋ฃ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ด๋๊ฐ์ ์ ์ ๊ธ๊ณ "์, try
๋ ๊ทธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ๊ฒ์
๋๋ค. ๋น์ ์ ๊ตฌ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ์
๋๋ค. ์ฃ์กํฉ๋๋ค."๋ผ๊ณ ๋งํด์ผ ํ ๊ฒ์
๋๋ค.
๋ฌธ์ ๋ "์๋๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ด ํน์ ํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค"๊ฐ ์๋๋ผ "์๋์์ ์ค๋ฅ๋ฅผ ๋ํํ์ง ์๋๋ก ๊ถ์ฅํฉ๋๋ค"์
๋๋ค. check-handle
์์ด๋์ด๋ก ์ธํด return ๋ฌธ์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๋ํ์ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ์ต๋๋ค.
์ด ์ ์์ ๋ฐ๋ผ defer
์ ํจ๊ป ๋ช
๋ช
๋ ๋ฐํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ ์ง๊ด์ ์ด์ง ์๊ณ ๋งค์ฐ ํดํคํด ๋ณด์
๋๋ค.
check-handle
์์ด๋์ด๋ก ์ธํด return ๋ฌธ์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๋ํ์ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ์ต๋๋ค.
๊ทธ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๋์์ธ ์ด์์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ํจ์์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ ์ฒ๋ฆฌ๊ธฐ ๊ฐ ์์ต๋๋ค.
@Goodwine ์ ์ํผ์ฌ ํฌ์ธํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋จ์ผ ๋ธ๋ฆฌ์ง ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ HandleErrorf
์ ๊ฐ์ ๋ณ๋์ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค.
func handler(err *error, handle func(error) error) {
// nil handle is treated as the identity
if *err != nil && handle != nil {
*err = handle(*err)
}
}
๋น์ ์ด ์ข์ํ ๊ฒ์ ๋๋ค
defer handler(&err, func(err error) error {
if errors.Is(err, io.EOF) {
return nil
}
return fmt.Errorf("oops: %w", err)
})
handler
์์ฒด๋ฅผ try
์ ๊ฐ์ ๋ฐ ๋ง๋ฒ ๋ด์ฅ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ง๋ฒ์ด๋ผ๋ฉด, ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ์์์ ์ผ๋ก ์ทจํ์ฌ error
๋ฐํ ์ด๋ฆ์ ์ง์ ํ์ง ์๋ ํจ์์์๋ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ ํ์ฌ ์ ์์ ๋ ์ด์ด ์ข์ ์ธก๋ฉด ์ค ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด์ ๋ ์ ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๊น๋ค๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋ฌผ๋ก ์ด์ ์์ ๊ฐ ๋ง์ด ์ค์ด๋ค์ง๋ ์์ต๋๋ค.
defer handler(func(err error) error {
if errors.Is(err, io.EOF) {
return nil
}
return fmt.Errorf("oops: %w", err)
})
์ด๋ฐ ์์ผ๋ก ๋ง์ ์ด๋ผ๋ฉด defer
์ ๋ํ ์ธ์๋ฅผ ์ ์ธํ๊ณ ์ด๋์์๋ ์ฌ์ฉ๋๋ค๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋์ด์ผ ํฉ๋๋ค. ํ ๋จ๊ณ ๋ ๋์๊ฐ ์๋ฌต์ ์ผ๋ก ์ฐ๊ธฐํ๋๋ก ํ ์ ์์ง๋ง defer handler
๋ ๊ฝค ์ ์ฝ์ต๋๋ค.
defer
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ nil์ด ์๋ ์ค๋ฅ๊ฐ ๋ฐํ๋ ๋๋ง๋ค handle
func๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก try
์์ด๋ ์ ์ฉํฉ๋๋ค.
defer handler(wrapErrWithPackageName)
๋งจ ์์ fmt.Errorf("mypkg: %w", err)
๋ชจ๋ ๊ฒ.
๊ทธ๊ฒ์ ๋น์ ์๊ฒ ์ค๋๋ check
/ handle
์ ์์ ๋ง์ด ์ ๊ณตํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ช
์์ ์ผ๋ก err
์ ์ด๋ฆ์ ์ง์ ํ ํ์์ฑ์ ์์ ๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ(๊ทธ๋ฆฌ๊ณ ๋ช
์์ ์ผ๋ก) defer์ ํจ๊ป ์๋ํฉ๋๋ค. try
์ ๊ฐ์ด ํ๋ก ํธ ์๋์์ ์์ ํ ๊ตฌํํ ์ ์๋ ๋น๊ต์ ๊ฐ๋จํ ๋งคํฌ๋ก์
๋๋ค.
๊ทธ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๋์์ธ ์ด์์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ํจ์์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ต๋๋ค.
๋ด ๋์, ๋น์ ์ด ๋ง์ต๋๋ค.
๋ฌธ์ ์ ์๋ 90%๊ฐ ์๋๋ผ 10%์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ์ฃผ์ฅ์ ํ์คํ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ผ๋ฉฐ ๋๋ ๋ฐ๋ก ์ ๋ฃ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ด๋๊ฐ์ ์ ์ ๊ธ๊ณ "์, ์๋๋ ๊ทธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ๊ฒ์ ๋๋ค. ๋น์ ์ ๊ตฌ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒ์ ๋๋ค. ์ฃ์กํฉ๋๋ค."๋ผ๊ณ ๋งํด์ผ ํ ๊ฒ์ ๋๋ค.
๋์ํฉ๋๋ค. ์ ์๊ฐ์๋ ์ด ์ ์ ๋ํ์ด ์๋๋ผ EOF ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ํ์ธํ ๋ ๊ทธ๋ ค์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ์ ๋ ๋ง์ ์ปจํ ์คํธ๊ฐ ์๋ค๋ฉด ๋ ์ด์ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ์ ๋๋ค.
try()
๊ฐ ๋๋ฒ๊น
์ ์ ์ฉํ ์ปจํ
์คํธ๋ก ์ค๋ฅ๋ฅผ ์๋ ์ค๋ฐ๊ฟํ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด xerrors
๊ฐ errors
๊ฐ ๋๋ฉด ์ค๋ฅ์๋ try()
๊ฐ ์ถ๊ฐํ ์ ์๋ ์คํ ์ถ์ ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ทธ๊ฒ์ผ๋ก ์ถฉ๋ถํ ๊ฒ์
๋๋ค ๐ค
๋ชฉํ๊ฐ (https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md ์ฝ๊ธฐ)์ธ ๊ฒฝ์ฐ:
๋๋ ์ ์์ ๋ฐ์๋ค์ด๊ณ ๊ฑฐ๊ธฐ์ ์๋ ์์ญ์ต ์ค์ ์ฝ๋์ ๋ํด "์์ ๋จ๊ณ" ์ฝ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ์ฉํ ๊ฒ์ ๋๋ค.
์ ์๋ ๋์ :
func printSum(a, b string) error {
defer fmt.HandleErrorf(&err, "sum %s %s: %v", a,b, err)
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x + y)
return nil
}
์ฐ๋ฆฌ๋ ํ ์ ์์ต๋๋ค:
func printSum(a, b string) error {
var err ErrHandler{HandleFunc : twoStringsErr("printSum",a,b)}
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
return nil
}
์ฐ๋ฆฌ๋ ๋ฌด์์ ์ป์ ๊ฒ์ธ๊ฐ?
twoStringsErr์ printSum ๋๋ ์ค๋ฅ๋ฅผ ์บก์ฒํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ์ผ๋ฐ ์ฒ๋ฆฌ๊ธฐ(์ด ๊ฒฝ์ฐ 2๊ฐ์ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์ ์ฌ์ฉ)์ ์ธ๋ผ์ธ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ ํจ์์์ ๋์ผํ ๋ฐ๋ณต func ์๋ช
์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๊ฐ๊ฐ ๋ค์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์๊ฐ
๊ฐ์ ๋ฐฉ์์ผ๋ก ErrHandler ์ ํ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
type ioErrHandler ErrHandler
func (i ErrHandler) Handle() ...{
}
๋๋
type parseErrHandler ErrHandler
func (p parseErrHandler) Handle() ...{
}
๋๋
type str2IntErrHandler ErrHandler
func (s str2IntErrHandler) Handle() ...{
}
๋ด ์ฝ๋ ์ ์ฒด์์ ์ด๊ฒ์ ์ฌ์ฉํ์ญ์์ค.
func printSum(a, b string) error {
var pErr str2IntErrHandler
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
return nil
}
๋ฐ๋ผ์ ์ค์ ํ์๋ err.Error๊ฐ not nil๋ก ์ค์ ๋ ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์
๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์๋ ์์ต๋๋ค.
func (s str2IntErrHandler) Handle() bool{
**return false**
}
ํธ์ถํ๋ ํจ์๊ฐ ๋ฐํ ๋์ ๊ณ์ํ๋๋ก ์ง์ํฉ๋๋ค.
๋์ผํ ํจ์์์ ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
func printSum(a, b string) error {
var pErr str2IntErrHandler
var oErr overflowError
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
totalAsByte,oErr := sumBytes(x,y)
sunAsByte,oErr := subtractBytes(x,y)
return nil
}
๋ฑ.
๋ค์ ๋ชฉํ๋ฅผ ๋์ด์
x, err := strconv.Atoi(a)
์๊ฒ
x, err.Error := strconv.Atoi(a)
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก - ๋ ๋์ ๊ฐ๋ ์ฑ(IMO, ๋ค์)
@guybrand ๋น์ ์ (๋ด๊ฐ ์ข์ํ๋) ์ด ๋ํ์ด๋๋ ์ฃผ์ ์ ๋ํ ์ต์ ์ง์ง์์ ๋๋ค.
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes ์ฐธ์กฐ
@guybrand ์์ ํ ๋ค๋ฅธ ์ ์์ฒ๋ผ ๋ณด์ ๋๋ค. @griesemer ์ ์ ์์ ๋ํด ๋ ผ์ํ๋ ๋ฐ ์ง์คํ ์ ์๋๋ก ์์ฒด ๋ฌธ์ ๋ก ์ ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@natefinch ๋์ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ฝ๊ธฐ๋ฅผ ์ต์ ํํ๋ ๋์ Go๋ฅผ ์ฐ๋ ๋์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ๋ ์ ํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. IDE ๋งคํฌ๋ก๋ ์ค๋ํซ์ด ์ด๊ฒ์ด ์ธ์ด์ ๊ธฐ๋ฅ์ด ๋์ง ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@๊ตฟ์์ธ
์ ์ฉํ ์ปจํ ์คํธ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
try()
์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ์ต๊ด์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ฆ,try()
๋ ์๋ฌด๋ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง ์๋ ๊ธฐ๋ฅ์ด๋ฉฐ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ ์กด์ฌํ์ง ์์์ ์๋ ์๋ ๊ธฐ๋ฅ์ด ๋ฉ๋๋ค.
์ ์์์์ ์ธ๊ธํ ๋ฐ์ ๊ฐ์ด(์์๋ก ํ์๋จ) try
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฉ์งํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ ์๋ ๋ฐฉ์, ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์์ ํ ์ง๊ตํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ์ ์์ FAQ์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
try
ํจ์ ํธ์ถ์ ๋ค๋ฅธ ์ค๋ฅ์ ์ถ๊ฐํ๋ ค๋ ์ฌ๋ฌ ์ปจํ
์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋จ์ผ ํจ์ ๋ด์์ ์ ์ฉํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ํ HandleErrorf
์ ์ผ๋ฐ์ ์ธ ๋งฅ๋ฝ์์ ์ค๋ฅ์ ํจ์ ์ ์ฒด ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๊ด๋ฒ์ํ ์ฌ์ฉ ์์ญ์ ํฌ๊ดํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๊ทธ๋ฅ "๊ธ์, ์ซ์ผ๋ฉด ์ฐ์ง ๋ง๊ณ ๋ฅ์ณ"(์ด๋ฐ ์์ผ๋ก ์ฝํ๋ค)๋ผ๊ณ ๋งํ๋ ๊ฒ๋ณด๋ค, ๋ง์ ์ฌ์ฉ์ด ๊ฒฐํจ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์๋ ๋ถ๋ถ์ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ๋ค. ๋์์ธ์.
๊ทธ๋ ๊ฒ ์ฝํ๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ด ์์ ์ ๋น์ ์ด ๊ทธ๊ฒ์ ์ข์ํ์ง ์์ผ๋ฉด ๊ทธ๊ฒ์ด ์กด์ฌํ์ง ์๋ ์ฒํด์ผํ๋ค๋ ๊ฒ์ด ์๋๋๋ค. try
๊ฐ ์ธ๋ชจ์๊ณ ๊ทธ๋ฌํ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํฉ๋๋ค. ์ด ์ ์์์๋ KISS์ ์ผ๋ฐ ์ ํธ๋ฆฌํฐ ๊ฐ์ ์ข์ ๊ท ํ์ ์ ์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ ์ ์์ ๋ด๊ฐ ๋ถ๋ถ๋ช
ํ๋ค๊ณ ์๊ฐํ์ง ์์๋ค.
์ง๊ธ๊น์ง ๋ง์ ํผ๋๋ฐฑ์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ ์ตํฉ๋๋ค.
ํผ๋๋ฐฑ์ ๋ํ ๋ ๋์ ๋๋์ ์ป๊ธฐ ์ํด ์ด๊ธฐ ์์ฝ์ ์๋ํ์ต๋๋ค. ์ ๊ฐ ๋์ณค๊ฑฐ๋ ์๋ชป ํํํ ์ฌ๋์ ๋ํด ๋ฏธ๋ฆฌ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ์ ์ฒด์ ์ธ ์์ง๋ฅผ ์ ๋๋ก ํ์
ํ์
จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
0) ๊ธ์ ์ ์ธ ์ธก๋ฉด์์ @rasky , @adg , @eandre , @dpinela ๋ฐ ๊ธฐํ ์ฌ์ฉ์๋ try
๊ฐ ์ ๊ณตํ๋ ์ฝ๋ ๋จ์ํ์ ๋ํด ๋ช
์์ ์ผ๋ก ํ๋ณต์ ํํํ์ต๋๋ค.
1) ๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ๋ try
๊ฐ ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ ์คํ์ผ์ ๊ถ์ฅํ์ง ์๊ณ ๋์ "๋น ๋ฅธ ์ข
๋ฃ"๋ฅผ ์ด์งํ๋ค๋ ๊ฒ์
๋๋ค. ( @agnivade , @peterbourgon , @politician , @a8m , @eandre , @prologic , @kungfusheep , @cpuguy , ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด์ ๋ํด ์ฐ๋ ค๋ฅผ ํ๋ช
ํ์ต๋๋ค.)
2) ๋ง์ ์ฌ๋๋ค์ด return
๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ด์ฅ ๋๋ ๋ด์ฅ ํจ์ ๊ตฌ๋ฌธ์ ์ข์ํ์ง ์์ต๋๋ค. ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ( @sheerun , @Redundancy , @dolmen , @komuw , @RobertGrantEllis , @elagergren-spideroak ). try
๋ ํนํ ์์๋ก ์ค์ฒฉ๋ ์ ์๋ ํํ์์ ๋ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ๊ฐ๊ณผ๋ ์ ์์ต๋๋ค(@peterbourgon). @natefinch ๋ try
๊ฐ "ํ ์ค์ ๋๋ฌด ๋ง์ ๊ฒ์ ๋คํํ๊ธฐ๊ฐ ๋๋ฌด ์ฝ๊ธฐ" ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก Go์์ ํผํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ฐ๋ คํฉ๋๋ค. ๋ํ try
๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํ IDE ์ง์์ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค(@dominikh). try
๋ "๋
๋ฆฝ"ํด์ผ ํฉ๋๋ค.
3) ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ๋ช
์์ ์ธ if
๋ฌธ์ ํ์์ด ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ทธ๊ฒ์ ๋ง์กฑํฉ๋๋ค( @bitfield , @marwan-at-work, @natefinch). ์ผ์ ํ๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค(@gbbr). ๊ทธ๋ฆฌ๊ณ ๋ช
์์ if
๋ฌธ์ ์์์ return
( @DavexPro , @hmage , @prologic , @natefinch)๋ณด๋ค ๋ซ์ต๋๋ค.
๊ฐ์ ์ค์ ๋ฐ๋ผ @mattn ์ try
์ ๋ํ ์ค๋ฅ ๊ฒฐ๊ณผ์ "์์์ ๋ฐ์ธ๋ฉ"์ ๋ํด ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ์ฐ๊ฒฐ์ ์ฝ๋์์ ๋ช
์์ ์ผ๋ก ํ์๋์ง ์์ต๋๋ค.
4) try
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ฒ๊น
๋ช
๋ น๋ฌธ์ด ์ฝ์
๋ ์ ์๋๋ก try
ํํ์์ if
๋ช
๋ น๋ฌธ์ผ๋ก ๋ค์ ์์ฑํด์ผ ํ ์๋ ์์ต๋๋ค( @deanveloper , @typeless , @networkimprov , ๊ธฐํ).
5) ๋ช ๋ช ๋ ๋ฐํ( @buchanae , @adg) ์ฌ์ฉ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
์ฌ๋ฌ ์ฌ๋๋ค์ด ์ ์์ ๊ฐ์ ํ๊ฑฐ๋ ์์ ํ๊ธฐ ์ํ ์ ์์ ์ ๊ณตํ์ต๋๋ค.
6) ์ผ๋ถ๋ ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฅ๋ คํ๊ธฐ ์ํด ์ ํ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ(@beoran) ๋๋ try
( @unexge , @a8m , @eandre , @gotwarlost)์ ์ ๊ณต๋ ํ์ ๋ฌธ์์ด์ ๋ํ ์์ด๋์ด๋ฅผ ์ป์์ต๋๋ค.
7) @pierrec ์ gofmt
๊ฐ try
ํํ์์ ํ์์ ์ ์ ํ๊ฒ ์ง์ ํ์ฌ ๋ ์ ๋ณด์ด๋๋ก ํ ์ ์๋ค๊ณ ์ ์ํ์ต๋๋ค.
๋๋ gofmt
์ด ํ ์ค(@zeebo)์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ๋ if
๋ฌธ์ ํ์ํํ๋๋ก ํ์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
8) @marwan-at-work๋ try
๊ฐ ๋จ์ํ if
๋ฌธ์์ try
์์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ํํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋์ ์ค์ ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด Go๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ค์ ๋ก ์์์ ์ผ๋ก ๋ง๋ค์ด "์์ "ํด์ผ ํฉ๋๋ค. ๋ชฉํ๋ (์ ์ ํ) ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ๋จ์ํ๊ฒ ๋ง๋ค๊ณ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ด๋ ๊ฒ์
๋๋ค(@cpuguy).
9) ๋ง์ง๋ง์ผ๋ก ์ด๋ค ์ฌ๋๋ค์ try
( @beoran , @HiImJC , @dolmen) ๋ผ๋ ์ด๋ฆ์ ์ข์ํ์ง ์๊ฑฐ๋ ?
( @twisted1919 , @leaxoy , ๊ธฐํ)์ ๊ฐ์ ๊ธฐํธ๋ฅผ ์ ํธํฉ๋๋ค. .
์ด ํผ๋๋ฐฑ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฒฌ(์์๋๋ก ๋ฒํธ ์ง์ ):
0) ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค! :-)
1) ์ด ๋ฌธ์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค๋ฅ๋ฅผ ํ
์คํธํ๊ธฐ ์ํด if
๋ฌธ์ ์ฌ์ฉํ๋ ํ์ฌ ์ฝ๋ฉ ์คํ์ผ์ ์ต๋ํ ๋ช
์์ ์
๋๋ค. ๊ฐ๋ณ์ ์ผ๋ก(๊ฐ if
์ ๋ํด) ์ค๋ฅ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ข
์ข
defer
๋ก ์ํํ ์ ์๋ ๊ท ์ผํ ๋ฐฉ์์ผ๋ก ํจ์์์ ๊ฐ์ง๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ๊ฐ๋ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ธ์ด์์ ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ defer
์ ์ง๊ตํ์ง ์๋ ํธ๋ค๋ฌ ๊ตฌ์ฑ์ ๋ฌธ์ ๋ ์ค๋ฅ๋ฅผ ์ฆ๊ฐ์ํค๊ธฐ ์ํ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ ๋จ๊ฒจ๋๋๋ก ํ์ต๋๋ค. .
2) ๋ฌผ๋ก ๋ด์ฅ ๋์ ํค์๋๋ ํน์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ ํค์๋๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์๋ก์ด ์ด์์๋ ๊ทธ๋ด ์๋ ์์ง๋ง ๋ ๋์ ๋๊ฒ ๋ณด์ ๋๋ค. ์์ธํ ์ ์์ ๋ค์ํ ์ฅ๋จ์ ์ ๊ธธ๊ฒ ๋ ผ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์๋ชป ํ๋จํ๊ณ ์์ต๋๋ค.
3) ์ด ์ ์์ ์ด์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ(ํนํ ๊ด๋ จ ์์ฉ๊ตฌ ์ฝ๋)๊ฐ Go ์ปค๋ฎค๋ํฐ์์ (์ ๋ค๋ฆญ ๋ถ์กฑ๊ณผ ํจ๊ป) Go์์ ์ค์ํ ๋ฌธ์ ๋ก ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ์ ์์ ์์ฉ๊ตฌ ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํฉ๋๋ค. ๋ ๋ณต์กํ ๊ฒฝ์ฐ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ๋ ์ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ์ด์์ ์ํํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ ์ฌ๋๋ค์ด ํ์ ์ ์ง์ ๋ง์กฑํ๊ณ ์์ง๋ง try
์ ๊ฐ์ ๋ณด๋ค ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ข์ํ๋ ์ฌ๋๋ค๋ (์๋ง๋) ๋๊ฐ์ด ๋ง์ต๋๋ค. ๊ตฌ๋ฌธ ์คํ.
4) ๋๋ฒ๊น
์ง์ ์ ์ ํจํ ๋ฌธ์ ์
๋๋ค. ์ค๋ฅ ๊ฐ์ง์ return
์ฌ์ด์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ try
ํํ์์ if
๋ฌธ์ผ๋ก ๋ค์ ์์ฑํด์ผ ํ๋ ๊ฒ์ ์ง์ฆ๋ ์ ์์ต๋๋ค.
5) ๋ช ๋ช ๋ ๋ฐํ ๊ฐ: ์์ธํ ๋ฌธ์์์ ์ด์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ด๊ฒ์ด ์ด ์ ์์ ๋ํ ์ฃผ์ ๊ด์ฌ์ฌ๋ผ๋ฉด ์ฐ๋ฆฌ๋ ์ข์ ์์น์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
6) try
์ ๋ํ ์ ํ์ ํธ๋ค๋ฌ ์ธ์ : ์์ธํ ๋ฌธ์์์๋ ์ด์ ๋ํด ์ค๋ช
ํฉ๋๋ค. ๋์์ธ ๋ฐ๋ณต ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
7) gofmt
๋ฅผ ์ฌ์ฉํ์ฌ $ try
ํํ์์ ํ์์ ์ง์ ํ์ฌ ์ถ๊ฐ๋ก ํ์๋๋๋ก ํ๋ ๊ฒ์ ํ์คํ ์ต์
์
๋๋ค. ๊ทธ๋ฌ๋ ํํ์์ ์ฌ์ฉ๋ ๋ try
์ ์ผ๋ถ ์ด์ ์ด ์ฌ๋ผ์ง๋๋ค.
8) ์ค๋ฅ ํ
์คํ
( try
) ๊ด์ ์ด ์๋ ์ค๋ฅ ์ฒ๋ฆฌ( handle
) ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ๊ณ ๋ คํ์ต๋๋ค. ํนํ, ์ฐ๋ฆฌ๋ ๊ฐ๋จํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ๊ฐ๋
์ ๋์
ํ๋ ๊ฒ๋ง ๊ณ ๋ คํ์ต๋๋ค(์๋
Gophercon์์ ๋ฐํ๋ ์๋ ๋์์ธ ์ด์๊ณผ ์ ์ฌ). ๋ง์ง๋ง ๊ฐ์ด error
์ ํ์ธ ๋ค์ค ๊ฐ ํ ๋น์์ ํธ๋ค๋ฌ๊ฐ ์ ์ธ๋ ๊ฒฝ์ฐ์๋ง ํด๋น ๊ฐ์ ํ ๋น์์ ์๋ตํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๊ทธ๊ฒ์ด nil์ด ์๋์ง ์์์ ์ผ๋ก ํ์ธํ๊ณ ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ํธ๋ค๋ฌ๋ก ๋ถ๊ธฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์ ํ ์ฌ๋ผ์ง๊ณ ๋ชจ๋ ์ฌ๋์ด ๋์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ์ด๊ฒ์ ์์ ํ ์์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ทน๋จ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋ณด์์ต๋๋ค. ๊ฒ์ฌ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ๋ณด์ด์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
9) ์ด ์์ ์์ ์ด๋ฆ์ ์์ ๊ฑฐ๋ก ์ฎ๊ธฐ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด ์ด๋ฆ์ ๋ฏธ์ธ ์กฐ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ ์ฐ๋ ค๊ฐ ์ ํจํ์ง ์๋ค๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ์์ ๋ต๋ณ์ ๋จ์ํ ์ฐ๋ฆฌ์ ํ์ฌ ์๊ฐ์ ๋ํ๋ ๋๋ค. ์์ผ๋ก ์๋ก์ด ์ฐ๋ ค ์ฌํญ(๋๋ ์ด๋ฌํ ์ฐ๋ ค ์ฌํญ์ ๋ท๋ฐ์นจํ๋ ์๋ก์ด ์ฆ๊ฑฐ)์ ๋ํด ์ธ๊ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฏธ ์ธ๊ธํ ๋ด์ฉ์ ๋ค์ ์ธ๊ธํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, ์ด ๋ฌธ์ ์ ๋ํด ๋ ผํํ๋ ๋ชจ๋ ์ฌ๋์ด ์์ธํ ๋ฌธ์๋ฅผ ์ฝ์ ๊ฒ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๋ฏธ ๋งํ ๋ด์ฉ์ ๋ฐ๋ณตํ์ง ์๋๋ก ๋๊ธ์ ์์ฑํ๊ธฐ ์ ์ ๊ทธ๋ ๊ฒ ํ์ญ์์ค. ๊ฐ์ฌ ํด์.
์ด๊ฒ์ ์ ์์ ๋ํ ์๊ฒฌ์ด ์๋๋ผ ์คํ ๋ณด๊ณ ์์ ๋๋ค. ์ ์ฒด ์ ์์ด ๊ฒ์๋ ์ดํ๋ก ์์ ๋์ง ์์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ธ๊ธํ๊ฒ ์ต๋๋ค.
func try(t1 T1, t1 T2, โฆ tn Tn, te error) (T1, T2, โฆ Tn)
ํด์ผํ๋ค:
func try(t1 T1, t2 T2, โฆ tn Tn, te error) (T1, T2, โฆ Tn)
์ค๋ฅ ๊ฒ์ฌ ๋ฌธ์ ๋ํด ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ Go ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๋๋ถ๋ถ์ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ๋ฐ๋ณต๋๋์ง ๋๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋์ผํ ๊ธฐ๋ฅ ๋ด์์ ์ฌ๋ฌ ๊ฒ์ฌ๊ฐ ๋ค๋ฅธ ์ปจํ
์คํธ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋์ง ์์๋ผ ๊ฐ์น๊ฐ ์์ต๋๊น? ์ด ์ ์์ ์ ์์ ๊ฒฝ์ฐ์๋ ๋ง์ ์๋ฏธ๊ฐ ์์ง๋ง ํ์์๋ ๋์์ด ๋์ง ์์ต๋๋ค. ํ์์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ if err != nil
๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ์ถ๊ฐ ์ปจํ
์คํธ ์ถ๊ฐ๋ฅผ ํฌ๊ธฐํ๊ณ try()
๋ฅผ ์ฌ์ฉํ๊ณ IMO๊ฐ ํด๋ก์ธ ์ ์๋ ๊ธฐ๋ฅ๋ณ๋ก ๊ณตํต ์ค๋ฅ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์์กดํฉ๋๋ค. ๋ค๊ฐ์ค๋ ์ค๋ฅ ๊ฐ ๊ธฐ๋ฅ์ ํตํด ์ฌ๋๋ค์ด ๋ ๋ง์ ์ ๋ณด๋ก ์ค๋ฅ๋ฅผ ๋ ์์ฃผ ๊ฐ์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์๋ง๋ ๋ด๊ฐ ์ ์์ ์๋ชป ์ดํดํ์ง๋ง AFAIU๋ ๋จ์ผ ํจ์์ ๋ชจ๋ ์ค๋ฅ๊ฐ ์ ํํ ํ ๋ฐฉํฅ์ผ๋ก ๋ํ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ฉฐ, ํจ์๊ฐ ๋ค๋ฅด๊ฒ ๋ํํด์ผ ํ ์ ์๋ 5๊ฐ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ ๋์์ด ๋์ง ์์ต๋๋ค. ์ผ์์์ ๊ทธ๋ฌํ ๊ฒฝ์ฐ๊ฐ ์ผ๋ง๋ ํํ์ง(๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ ๊ฝค ์ผ๋ฐ์ ์) ํ์คํ์ง ์์ง๋ง try()
๊ฐ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๋์๋ ์ฌ๋๋ค์ด ํจ์๋น ๊ณตํต ๋ํผ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ ์ ์๋ค๊ณ ์ฐ๋ คํฉ๋๋ค. ๋ค๋ฅด๊ฒ.
์์ ์ํ ์ธํธ์ ๋ฐ์ดํฐ๋ก ๋ท๋ฐ์นจ๋๋ ๊ฐ๋จํ ์ค๋ช :
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์์ฉ๊ตฌ if ๋ฌธ์ ์ ๊ฑฐํ๋๋ก ํน๋ณํ ์ค๊ณ๋ try๋ผ๋ ์๋ก์ด ๋ด์ฅ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
์ด๊ฒ์ด ์ด ์ ์์ผ๋ก ํด๊ฒฐ๋๋ ํต์ฌ ๋ฌธ์ ์ธ ๊ฒฝ์ฐ ์ด "๋ณด์ผ๋ฌ ํ๋ ์ดํธ"๋ ์ด ~60k SLOC์ ๋ฌํ๋ ์์ญ ๊ฐ์ ๊ณต๊ฐ ์คํ ์์ค ํ๋ก์ ํธ์์ ๋ด ์ฝ๋์ ~1.4%๋ง ์ฐจ์งํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ๋น์ทํ ํต๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๊ถ๊ธํ์ญ๋๊น?
Go ์์ฒด์ ๊ฐ์ ํจ์ฌ ๋ ํฐ ์ฝ๋๋ฒ ์ด์ค์์ ์ด ~160๋ง SLOC๋ if err != nil
์ ๊ฐ์ ํ์ด ์๋ ์ฝ๋๋ฒ ์ด์ค์ ์ฝ ~0.5%์ ํด๋นํฉ๋๋ค.
์ด๊ฒ์ด Go 2๋ก ํด๊ฒฐํด์ผ ํ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ๋ฌธ์ ์ ๋๊น?
์๊ฐ์ ๋ด์ด ๋ชจ๋ ์ฌ๋์ ์์ด๋์ด๋ฅผ ์ดํด๋ณด๊ณ ๋ช ์์ ์ผ๋ก ์๊ฐ์ ์ ๊ณตํ @griesemer ์๊ฒ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ ๊ณผ์ ์์ ์ปค๋ฎค๋ํฐ์ ๋ชฉ์๋ฆฌ๊ฐ ๋ค๋ฆฐ๋ค๋ ์ธ์์ ์ ๋ง ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
- @pierrec ๋ gofmt๊ฐ try ํํ์์ ์ ์ ํ๊ฒ ํ์ํํ์ฌ ๋ ์ ๋ณด์ด๋๋ก ํ ์ ์๋ค๊ณ ์ ์ํ์ต๋๋ค.
๋๋ gofmt์์ ํ ์ค(@zeebo)์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ๋ if ๋ฌธ์ ํ์ํํ๋๋ก ํ์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
gofmt
๋ฅผ ์ฌ์ฉํ์ฌ $try
ํํ์์ ํ์์ ์ง์ ํ์ฌ ์ถ๊ฐ๋ก ๋์ ๋๋๋ก ํ๋ ๊ฒ์ ํ์คํ ์ต์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ํํ์์ ์ฌ์ฉ๋ ๋try
์ ์ผ๋ถ ์ด์ ์ด ์ฌ๋ผ์ง๋๋ค.
์ด๊ฒ๋ค์ try
ํ์์ ์ง์ ํ๊ธฐ ์ํด gofmt
์ ์๊ตฌํ๋ ๊ฒ์ ๋ํ ๊ท์คํ ์๊ฐ์ด์ง๋ง if
gofmt
์ ๋ํด ํน๋ณํ ์๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ์ค๋ฅ๋ ํ ์ค์
๋๋ค. ์ ์์ try
ํ์์ผ๋ก ์ผ๊ด ์ฒ๋ฆฌ๋์์ง๋ง ์์ ํ ์ง๊ตํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ฌ ํด์.
@griesemer ๋ชจ๋ ์๊ฒฌ์ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๋ถ๋ ์๋์ง๋ผ๋ ๊ฐ์ฅ ๋ง์ด ๋ต๋ณํด ์ฃผ์ ๋๋ผ์ด ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค ๐
๊ทํ์ ํผ๋๋ฐฑ์์ ํด๊ฒฐ๋์ง ์์ ํ ๊ฐ์ง๋ Go ๊ตฌ๋ฌธ์ ์ ๋ฐ์ดํธํ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด Go ์ธ์ด์ ๋๊ตฌ/๊ฒํ ๋ถ๋ถ์ ์ฌ์ฉํ๋ ์์ด๋์ด์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ก์ด LSP( gopls
)๊ฐ ์ถ์๋๋ฉด์ ํจ์์ ์๋ช
์ ๋ถ์ํ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ์ ํ ๋ํ ๋ฐ ๊ฒ์ฌ๋ ์ํํ๊ธฐ์ ์๋ฒฝํ ์ฅ์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@griesemer ๋๋ ์ด๊ฒ์ด ์ ์๊ฐ๋์ง ์์๋ค๊ณ ํ์ ํ์ง๋ง, https://www.reddit.com/r/golang/comments/bwvyhe ์์ ๋ด๊ฐ ํธ์ํ ์ ์๋ ๊ฒ์ ๋ ๊ฐ๊น๊ฒ ๊ทํ์ ์ ์์ ์์ ํ๋ ค๊ณ ํ์ต๋๋ค.
@zeebo gofmt
ํ์ if err != nil { return ...., err }
์ ํ ์ค์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ง๋ ๋ชจ๋ "์งง์" if
๋ฌธ์ด ์๋๋ผ ์ด ํน์ ์ข
๋ฅ์ if
ํจํด์๋ง ํด๋น๋ ๊ฒ์
๋๊น?
๊ฐ์ ๋งฅ๋ฝ์์ try
๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ฐ์ ๋ผ์ธ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์ด์ง ์๋ ๊ฒ์ ๋ํ ์ฐ๋ ค๊ฐ ์์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ ์ต์
์ด ์์ต๋๋ค.
ํ์ฌ ์คํ์ผ:
a, b, c, ... err := BusinessLogic(...)
if err != nil {
return ..., err
}
ํ ์ค if
:
a, b, c, ... err := BusinessLogic(...)
if err != nil { return ..., err }
๋ณ๋์ ์ค์ try
(!):
a, b, c, ... err := BusinessLogic(...)
try(err)
์ ์๋ try
:
a, b, c := try(BusinessLogic(...))
์ฒซ ๋ฒ์งธ ์ค๊ณผ ๋ง์ง๋ง ์ค์ด ๊ฐ์ฅ ๋ช
ํํด ๋ณด์
๋๋ค. ํนํ try
๋ฅผ ์๋ ๊ทธ๋๋ก ์ธ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ง์ง๋ง ์ค์์ ์ค๋ฅ๋ ๋ช
์์ ์ผ๋ก ๊ฒ์ฌ๋์ง๋ง (์ผ๋ฐ์ ์ผ๋ก) ์ฃผ์ ์์
์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ข ๋ ๋ง์ด ๋ฐ์ํฉ๋๋ค.
@marwan-at-work ๋๊ตฌ๊ฐ ๋น์ ์ ์ํด ๋ฌด์์ ์ ์ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ป๊ฒ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์จ๊ธธ ๊ฒ์ ์ ์ํฉ๋๊น?
@dpinela
@guybrand ์์ ํ ๋ค๋ฅธ ์ ์์ฒ๋ผ ๋ณด์ ๋๋ค. @griesemer ์ ์ ์์ ๋ํด ๋ ผ์ํ๋ ๋ฐ ์ง์คํ ์ ์๋๋ก ์์ฒด ๋ฌธ์ ๋ก ์ ์ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
IMO ๋ด ์ ์์ ๊ตฌ๋ฌธ ๋ง ๋ค๋ฆ ๋๋ค. ์๋ฏธ:
๊ทธ๋์ ์ฃผ๋ ์ฐจ์ด์ ์ ์ฐ๋ฆฌ๊ฐ ํญ์ ๋ง์ง๋ง var to jnz ํธ์ถ์ ๋ถ์ํ๊ฑฐ๋ ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ์ค์ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๋ try(func())๋ก ์๋ ํจ์ ํธ์ถ์ ๋ํํ๋์ง ์ฌ๋ถ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ค๋ฅด๊ฒ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๊ฐ๋
์ ์ผ๋ก ๋งค์ฐ ์ ์ฌํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฐ๋ฉด์ - ์ผ๋ฐ์ ์ธ ์๋ .... catch๋ฅผ ๋ง์ C ๊ณ์ด ์ธ์ด๋ก ์ฌ์ฉํ๋ฉด ๊ตฌํ, ๊ฐ๋
์ฑ ๋ฑ์ด ๋งค์ฐ ๋ค๋ฆ
๋๋ค.
๊ทธ๋ฌ๋ ์ ์์ ์์ฑํ๋ ๊ฒ์ ๋ํด ์ง์งํ๊ฒ ์๊ฐํ๊ณ ์์ต๋๋ค. ์์ด๋์ด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@griesemer
๋๊ตฌ๊ฐ ๋น์ ์ ์ํด ๋ฌด์์ ์ ์ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ป๊ฒ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์จ๊ธธ ๊ฒ์ ์ ์ํฉ๋๊น?
์ ๋ฐ๋์
๋๋ค. gopls
๊ฐ ์ ํ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ์ ์ํฉ๋๋ค.
๋ง์ง๋ง ๋๊ธ์์ ์ธ๊ธํ๋ฏ์ด:
์ด ์ ์์ ์ด์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ(ํนํ ๊ด๋ จ ์์ฉ๊ตฌ ์ฝ๋)๊ฐ Go ์ปค๋ฎค๋ํฐ์์ (์ ๋ค๋ฆญ ๋ถ์กฑ๊ณผ ํจ๊ป) Go์์ ์ค์ํ ๋ฌธ์ ๋ก ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ์ ํต์ฌ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฒฐ๊ตญ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ ์ฝ๊ธฐ๊ฐ ์๋๋ผ ์ฐ๊ธฐ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ด ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํจ์ ์๋ช ์ ๋ถ์ํ๊ณ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ๋ฐฐ์นํ์ฌ ์ปดํจํฐ(tooling/gopls)๊ฐ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด ์์ฑํ๋๋ก ํ์ญ์์ค.
์๋ฅผ ๋ค์ด:
// user begins to write this function:
func openFile(path string) ([]byte, error) {
file, err := os.Open(path)
defer file.Close()
bts, err := ioutil.ReadAll(file)
return bts, nil
}
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๋ ํ์ผ์ ์ ์ฅํ์ฌ ๋๊ตฌ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ (gofmt/goimports๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌ) gopls
๋ ์ด ํจ์๋ฅผ ๋ณด๊ณ ๋ฐํ ์๋ช
์ ๋ถ์ํ๊ณ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅํฉ๋๋ค.
// user has triggered the tool (by saving the file, or code action)
func openFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("openFile: %w", err)
}
defer file.Close()
bts, err := ioutil.ReadAll(file)
if err != nil {
return nil, fmt.Errorf("openFile: %w", err)
}
return bts, nil
}
์ด๋ ๊ฒ ํ๋ฉด ๋ ์ธ๊ณ์ ์ฅ์ ์ ๋ชจ๋ ์ป์ ์ ์์ต๋๋ค. ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ ์์คํ
์ ๊ฐ๋
์ฑ/๋ช
ํ์ฑ์ ์ป๊ณ ํ๋ก๊ทธ๋๋จธ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ๋ฅผ ์์ฑ ํ์ง ์์์ต๋๋ค. ๋ ์ข์ ์ ์ ์ฌ์ฉ์๊ฐ ๋์ค์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ธ๋ก์ ์์ ํ์ฌ ๋ค๋ฅธ ๋์์ ์ํํ ์ ์๋ค๋ ์ ์
๋๋ค gopls
๋๊ตฌ๋ ๋ด๊ฐ ์ผ์ฐ ๋ฐํํ๋ ๋์ ํจ์์์ ๋์ค์ err
๋ฅผ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ๋๋ฌผ๊ธด ํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ด๊ฐ ์์ฑํ ์ฝ๋์
๋๋ค.
์ด์ ์ ์ด ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋ ๊ฒฝ์ฐ ์ฌ๊ณผํ์ง๋ง ์ด์ ๋ํ ์ธ๊ธ์ ์ฐพ์ ์ ์์ต๋๋ค.
try(DoSomething())
๋ ์ ์ฝํ๊ณ ์ดํด๊ฐ ๋ฉ๋๋ค. ์ฝ๋๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ค๊ณ ํฉ๋๋ค. try(err)
, OTOH๋ ์๋ฏธ์์ผ๋ก ์ฝ๊ฐ ๋ฒ์ด๋ ๋๋์ด ๋ญ๋๋ค. ์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ์๋ํฉ๋๊น? ์ ์๊ฐ์๋ ์ค๋ฅ๋ฅผ _ํ
์คํธ_ํ๊ฑฐ๋ _ํ์ธ_ํ ์ ์์ง๋ง _์๋_ํ๋ ๊ฒ์ ์ณ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
try(err)
๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ผ๊ด์ฑ์ ์ด์ ๋ก ์ค์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค try(DoSomething())
๊ฐ ์๋ํ๋ฉด ์ด์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง err := DoSomething(); try(err)
๋ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋๋ ํ์ด์ง์์ try(err)
๊ฐ ์ฝ๊ฐ ์ด์ํด ๋ณด์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ๊ฒ ์ฝ๊ฒ ์ด์ํ๊ฒ ๋ณด์ด๋๋ก ๋ง๋ค ์ ์๋ ๋ค๋ฅธ ๋ด์ฅ ํจ์๋ ์๊ฐํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ๋ฌธ์ ์ ๋ํด ๊ตฌ์ฒด์ ์ธ ์ ์์ด ์์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋๋ ์ด ๊ด์ฐฐ์ ํ๊ณ ์ถ์์ต๋๋ค.
@griesemer ๊ฐ์ฌํฉ๋๋ค. ์ฌ์ค, ์ ์์ return
๋ง์ ์ํ ๊ฒ์ด์์ง๋ง, ๋๋ ์ด๋ค ๋จ์ผ ๋ฌธ์ฅ๋ ํ ์ค๋ก ํ์ฉํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ
์คํธ์์ ํ
์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
if err != nil { t.Fatal(err) }
์ฒซ ๋ฒ์งธ ์ค๊ณผ ๋ง์ง๋ง ์ค์ด ๊ฐ์ฅ ๋ช ํํด ๋ณด์ ๋๋ค. ํนํ try๋ฅผ ์๋ ๊ทธ๋๋ก ์ธ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ง์ง๋ง ์ค์์ ์ค๋ฅ๋ ๋ช ์์ ์ผ๋ก ๊ฒ์ฌ๋์ง๋ง (์ผ๋ฐ์ ์ผ๋ก) ์ฃผ์ ์์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ข ๋ ๋ง์ด ๋ฐ์ํฉ๋๋ค.
๋ง์ง๋ง ์ค์๋ ๋น์ฉ์ ์ผ๋ถ๊ฐ ์จ๊ฒจ์ ธ ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์์ ๊ถ์ฅํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ผ๊ณ ๋ชฉ์๋ฆฌ๋ก ๋งํ ์ค๋ฅ์ ์ฃผ์์ ๋ฌ๊ณ ์ถ๋ค๋ฉด ํจ์ ์๋ช
์ ๋ณ๊ฒฝํ์ฌ ์ธ์์ ์ด๋ฆ์ ์ง์ ํ๊ณ ๋จ์ผ defer
๊ฐ ์ ์ฉ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํจ์ ๋ณธ๋ฌธ์ ๋ชจ๋ ์ข
๋ฃ, ๊ทธ๋ ์ง ์์ผ๋ฉด try
์ ๊ฐ์ด ์์ต๋๋ค. ๊ทธ ์ฉ์ด์ฑ ๋๋ฌธ์ ์ด์ฉ๋ฉด ๋ถ์ ์ ์ผ ์๋ ์์ต๋๋ค.
์์ง ๋ง์ ํ์ง ์์๋ค๊ณ ์๊ฐํ๊ธฐ์ ๋ ์ด์ ๋ง๋ถ์ผ ๋ง์ด ์์ต๋๋ค.
๋์์ธ ๋ฌธ์์์ ์ด ์ง๋ฌธ์ ๋๋ตํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ด ์ฝ๋์ ๊ธฐ๋ฅ:
func foo() (err error) {
src := try(getReader())
if src != nil {
n, err := src.Read(nil)
if err == io.EOF {
return nil
}
try(err)
println(n)
}
return nil
}
๋ด ์ดํด๋ ๊ทธ๊ฒ์ด ๋ก ์คํ์ ์ ๊ฑฐํ๋ค๋ ๊ฒ์ ๋๋ค.
func foo() (err error) {
tsrc, te := getReader()
if err != nil {
err = te
return
}
src := tsrc
if src != nil {
n, err := src.Read(nil)
if err == io.EOF {
return nil
}
terr := err
if terr != nil {
err = terr
return
}
println(n)
}
return nil
}
err
๊ฐ ๋ค์ดํค๋ ๋ฆฌํด ๋์ ์๋์๋๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ์ ์คํจํฉ๋๋ค. ์ด๊ฑฐ ์ปดํ์ผ ์๋๋์? ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๊ทธ๊ฒ์ ๋งค์ฐ ๋ฏธ๋ฌํ ์คํจ์ด๋ฉฐ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ๊ทธ๋ฆฌ ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์คํ๋ณด๋ค ๋ ๋ง์ ์ผ์ด ์ผ์ด๋๊ณ ์์ต๋๋ค.
@marwan-at-work
๋ง์ง๋ง ๋๊ธ์์ ์ธ๊ธํ๋ฏ์ด:
์ด ์ ์์ ์ด์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ(ํนํ ๊ด๋ จ ์์ฉ๊ตฌ ์ฝ๋)๊ฐ Go ์ปค๋ฎค๋ํฐ์์ (์ ๋ค๋ฆญ ๋ถ์กฑ๊ณผ ํจ๊ป) Go์์ ์ค์ํ ๋ฌธ์ ๋ก ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ์ ํต์ฌ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฒฐ๊ตญ ๋ง์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ ์ฝ๊ธฐ๊ฐ ์๋๋ผ ์ฐ๊ธฐ์ ๊ดํ ๊ฒ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ฐ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ์ ๊ฐ์ฅ ํฐ ์ฑ๊ฐ์ฌ์ ์
๋ ฅํด์ผ ํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ฉด ์ ์ฒด์ ์์ง์ผ๋ก ํจ์์ ํ๋ณตํ ๊ฒฝ๋ก๋ฅผ ๋ถ์ฐ์์ผ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ณ๋์ง. ๊ทธ ํจ๊ณผ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์์
์ฌ์ด์ ์์ฉ๊ตฌ ๋ธ๋ก์ด ์๋ I/O๊ฐ ๋ง์ ์ฝ๋์์ ํนํ ๋๋๋ฌ์ง๋๋ค. CopyFile
์ ๋จ์ํ ๋ฒ์ ์กฐ์ฐจ๋ ์ค์ ๋ก 5๋จ๊ณ(์คํ ์์ค, ๋ซ๊ธฐ ์์ค ์ฐ๊ธฐ, ๋์ ์ด๊ธฐ, ์์ค ๋ณต์ฌ -> ๋์, ๋์ ๋ซ๊ธฐ)๋ง ์ํํ๋๋ผ๋ 20์ค ์ ๋ ๊ฑธ๋ฆฝ๋๋ค.
ํ์ฌ ๊ตฌ๋ฌธ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๊ฐ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋ ์ผ๋ จ์ ์์ ์ด ์๋ ๊ฒฝ์ฐ ํ์ฌ ๊ตฌ๋ฌธ์ด ๋ชจ๋ ์ค๊ฐ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ต๋ช ์ผ๋ก ๋จ๊ฒจ์ฃผ์ธ์. ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ์ ๋ณด๊ฐ ๋ง์ง ์๋๋ผ๋ ํด๋น ์ด๋ฆ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ๋๋ ์ฃผ๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๋๋ค.
๋๋ ๋ณ๋์ ์ค์ try
๋ฅผ ์ข์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ handler
func๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ง์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
func try(error, optional func(error)error)
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
try(err)
handle := func(err error) error {
tx.Rollback()
return err
}
var res int64
_, err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
try(err, handle)
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
try(err, handle)
return tx.Commit()
}
@zeebo : ์ ๊ฐ ๋๋ฆฐ ์์ ๋ 1:1 ๋ฒ์ญ์
๋๋ค. ์ฒซ ๋ฒ์งธ(์ ํต์ ์ธ if
)๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์์๊ณ ๋ค๋ฅธ ๊ฒ๋ ์ฒ๋ฆฌํ์ง ์์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ด๊ฒ์ด ํจ์์์ ์ค๋ฅ๊ฐ ๊ฒ์ฌ๋๋ ์ ์ผํ ์ฅ์์ธ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์์ ( if
์ฌ์ฉ)๊ฐ ์ฝ๋ ์์ฑ์ ์ ์ ํ ์ ํ์ผ ์ ์์ต๋๋ค. ๋ชจ๋ ๋์ผํ ์ค๋ฅ ์ฒ๋ฆฌ(๋ํ)๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ฌ ๊ธฐ๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ defer
๋ฌธ์ ์ฌ์ฉํ์ฌ ํ ๊ณณ์์ ์ค๋ฅ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ ํ์ ์ผ๋ก if
๋ฅผ try
๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค(๋๋ ๊ทธ๋๋ก ๋์ญ์์ค). ํ์ธํด์ผ ํ ์ค๋ฅ๊ฐ ์ฌ๋ฌ ๊ฐ ์๊ณ ๋ชจ๋ ๋ค๋ฅด๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ(์ด๋ ํจ์์ ๊ด์ฌ์ฌ๊ฐ ๋๋ฌด ๊ด๋ฒ์ํ๊ณ ๋ถํ ํด์ผ ํ ์ ์๋ค๋ ์ ํธ์ผ ์ ์์) if
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํ์ด. ์, ๋์ผํ ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ฝ๋์ ๊ฐ์ธ ์ทจํฅ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. Go์์ "ํ ๊ฐ์ง ์์
์ ์ํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ"์ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ง๋ง, ํนํ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ ๊ทธ๋ ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด if
- else
- if
์ํ์ค๊ฐ โโ๋๋ฌด ๊ธธ์ด์ง๋ฉด switch
๊ฐ ๋ ์ ์ ํ ์ ์์ต๋๋ค. ๋๋ก๋ var x int
๋ณ์ ์ ์ธ์ด x := 0
๋ณด๋ค ์๋๋ฅผ ๋ ์ ํํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค(๋ชจ๋ ์ฌ๋์ด ์ด์ ๋ํด ๋ง์กฑํ๋ ๊ฒ์ ์๋๋๋ค).
"๋ค์ ์ฐ๊ธฐ"์ ๋ํ ์ง๋ฌธ์ ๋ํด: ์๋์, ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ฌ์์ฑ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ํ๋ฉฐ(์ฝ๋ ํจํด์ด ์ ์ํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์) ์ปดํ์ผ๋ฌ๊ฐ ์์ ๋ฐํ์ ๋ํด ๋ถํํ ํ์๊ฐ ์์ต๋๋ค. ๊ทํ์ ์์์๋ ์ค์ฒฉ ๋ฒ์์์ ๋ก์ปฌ err
๋ณ์๋ฅผ ์ ์ธํ์ต๋๋ค. try
๋ ๋ฌผ๋ก err
๊ฒฐ๊ณผ ๋ณ์์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ค์ ์ฐ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
[ํธ์ง๋จ] ์ถ์ : ๋ ๋์ ๋๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. try
๋ ์๋ชธ ๋ฐํ์ด ์๋๋๋ค(๋ค์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง). ๊ฒฐ๊ตญ try
nil
๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐํ๋๋ ์ค๋ฅ๋ฅผ ํฌํจํ๋(๋๋ ํฌํจํ๋) ์ธ์๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค. ๋ค์ดํค๋ ๋ฆฌํด์ ๋ํ ์๋์ฐ ์ค๋ฅ๋ ์์ค์ ์ค๋ฅ์
๋๋ค(์์ค์ ๊ธฐ๋ณธ ๋ฒ์ญ์ด ์๋๋๋ค. ์ปดํ์ผ๋ฌ์๋ ์ค๋ฅ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ค์ํ ํจ์์ ์ต์ข ๋ฐํ ์ ํ์ด ์ค๋ฅ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ๋นํฉํ ์ ์์ต๋๊น?
๋นํธ์ธ์ ๋ ๋ค์ฌ๋ค๋ฅํ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค(์: #32219์์ ๋ด ๊ด์ฌ์ฌ๋ฅผ ๋ง์กฑ์ํด)
@pjebs ์ด๊ฒ์ ๊ณ ๋ ค๋์ด ๊ฒฐ์ ๋์์ต๋๋ค. ์ธ๋ถ ์ค๊ณ ๋ฌธ์(์ด ์ฃผ์ ์ ๋ํ ๊ทํ์ ๋ฌธ์ ๋ฅผ ๋ช ์์ ์ผ๋ก ์ธ๊ธํจ)๋ฅผ ์ฝ์ผ์ญ์์ค.
๋๋ ๋ํ try()๊ฐ return ๋ฌธ์ผ๋ก ์๋ํ๋๋ผ๋ ํํ์์ผ๋ก ์ทจ๊ธ๋๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์, try๊ฐ ๋ด์ฅ ๋งคํฌ๋ก๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ ์ด๊ฒ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ฒ๋ผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
func doSomething() (error, error, error, error, error) {
...
}
try(try(try(try(try(doSomething)))))
๋์์ธ์ ๋ฐ๋ฅด๋ฉด ์ค๋ฅ์ ํจ๊ป ๋ฐํํ๋ ๋์ panic
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ์ต๋๋ค.
๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ๊ฐ์กฐํ๊ณ ์์ต๋๋ค.
๊ฐ์ฅ ์ค์ํ ํจ์๊ฐ error
์ ํ์ ์ต์ข
๋ฐํ ์ ํ์ ๊ฐ์ ธ์ผ ํ๋ค๋ ์ ํ์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ์ธํ๊ณ ํ์ฌ ์ ์์์ ๋ช
์๋ ๋๋ก ์ ํํ ์ํํ์ญ์์ค.
error
=> ํจ๋์ ์ต์ข
๋ฐํ ์ ํ์ด ์๋ ๊ฒฝ์ฐ
ํจํค์ง ์์ค ๋ณ์ ์ ์ธ์ try๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ => ํจ๋( MustXXX( )
๊ท์น์ด ํ์ ์์)
๋จ์ ํ ์คํธ์ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ์ธ์ด ๋ณ๊ฒฝ.
@mattn , ๋๋ ์๋นํ ์์ ์ฌ๋๋ค์ด ๊ทธ๋ฐ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ผ๊ณ ๋งค์ฐ ์์ฌํฉ๋๋ค.
@pjebs , ์๋ฏธ๋ก (ํ์ฌ ๊ธฐ๋ฅ์ ์ค๋ฅ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด ํจ๋)์ https://github.com/golang/proposal/blob/master/design/32437-try-builtin์์ ๋์์ธ ๋ฌธ์๊ฐ ๋ ผ์ํ๋ ๊ฒ๊ณผ ์ ํํ ๊ฐ์ต๋๋ค. md#ํ ๋ก .
๋ํ ์ค๋ฅ ๊ฒฐ๊ณผ๊ฐ ์๋ ํจ์ ๋ด๋ถ์์๋ง์ด ์๋๋ผ try๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋ค๋ ค๋ ์๋์์ try์ ์๋ฏธ๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. try๊ฐ ํจํค์ง ์์ค์์ ์ฌ์ฉ๋์๊ฑฐ๋ ์ค๋ฅ ๊ฒฐ๊ณผ ์์ด ํจ์ ๋ด๋ถ์์ ํธ์ถ๋ ๊ฒฝ์ฐ, try๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํจ๋ ์ํ๊ฐ ๋ฉ๋๋ค. (์ ์ณ๋๊ณ , ๊ทธ ์์ฑ ๋๋ฌธ์ ๋ด์ฅ์ ๊ทธ ์ ์์์ try๋ณด๋ค๋ must๋ผ๊ณ ๋ถ๋ ธ์ต๋๋ค.) try(๋๋ must)๊ฐ ์ปจํ ์คํธ์ ๋ฏผ๊ฐํ ๋ฐฉ์์ผ๋ก ํ๋ํ๋ ๊ฒ์ ์์ฐ์ค๋ฝ๊ณ ๋งค์ฐ ์ ์ฉํด ๋ณด์์ต๋๋ค. ๋ง์ ์ฌ์ฉ์ ์ ์ ํ์ ๋์ฐ๋ฏธ ํจ์๋ ํ์ฌ ํจํค์ง ์์ค ๋ณ์ ์ด๊ธฐํ ํํ์์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ํ ์คํธ ํจํค์ง๋ฅผ ํตํด ๋จ์ ํ ์คํธ์์ ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์ด๋ฆฝ๋๋ค.
๊ทธ๋ฌ๋ try์ ์ปจํ ์คํธ ๊ฐ๋๋ ์ด๋ ค์ด ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ฅ ๊ฒฐ๊ณผ๊ฐ ์๋ช ์์ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ฉด try ํธ์ถ์ ํฌํจํ๋ ํจ์์ ๋์์ด ์กฐ์ฉํ(ํจ๋ ์ํ์์ ํจ๋ ์ํ๊ฐ ์๋ ์ํ๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก) ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋๋ฌด ์ํํ ์ฌ์ฐ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋ช ๋ฐฑํ ํด๊ฒฐ์ฑ ์ try์ ๊ธฐ๋ฅ์ must์ try๋ผ๋ ๋ ๊ฐ์ ๊ฐ๋ณ ๊ธฐ๋ฅ์ผ๋ก ๋๋๋ ๊ฒ์ด์์ต๋๋ค(๋ฌธ์ #31442์์ ์ ์ํ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌ). ๊ทธ๋ฌ๋ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ์ง์์ ๋ํ ์ฆ๊ฐ์ ์ธ ์๊ตฌ์ ์ง์ ์ฐ๊ฒฐ๋ ์๋์ ํจ๊ป ๋ ๊ฐ์ ์๋ก์ด ๋ด์ฅ ํจ์๊ฐ ํ์ํ์ ๊ฒ์ ๋๋ค.
@pjebs ๊ทธ๊ฒ์ด _์ ํํ_ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์์์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค(์์ธํ ๋ฌธ์, ๋์์ธ ๋ฐ๋ณต ์น์ , 4๋ฒ์งธ ๋จ๋ฝ ์ฐธ์กฐ):
๋ํ ์ค๋ฅ ๊ฒฐ๊ณผ๊ฐ ์๋ ํจ์ ๋ด๋ถ์์๋ง์ด ์๋๋ผ try๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋ค๋ ค๋ ์๋์์ try์ ์๋ฏธ๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. try๊ฐ ํจํค์ง ์์ค์์ ์ฌ์ฉ๋์๊ฑฐ๋ ์ค๋ฅ ๊ฒฐ๊ณผ ์์ด ํจ์ ๋ด๋ถ์์ ํธ์ถ๋ ๊ฒฝ์ฐ, try๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํจ๋ ์ํ๊ฐ ๋ฉ๋๋ค. (์ ์ณ๋๊ณ , ๊ทธ ์์ฑ ๋๋ฌธ์ ๋ด์ฅ์ ๊ทธ ์ ์์์ ์๋ํ๊ธฐ ๋ณด๋ค๋ must๋ผ๊ณ ๋ถ๋ ธ์ต๋๋ค.)
(Go Team ๋ด๋ถ) ํฉ์๋ try
๊ฐ ์ปจํ
์คํธ์ ์์กดํ๊ณ ๋ค๋ฅด๊ฒ ํ๋ํ๋ ๊ฒ์ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๋ ๊ฒ์ด์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ํจ์์ ์ถ๊ฐ(๋๋ ์ ๊ฑฐ)ํ๋ฉด ํจ๋์์ ํจ๋์ด ์๋ ๊ฒ์ผ๋ก(๋๋ ๊ทธ ๋ฐ๋๋ก) ํจ์์ ๋์์ ์กฐ์ฉํ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
@griesemer ์ฌ์์ฑ์ ๋ํ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ์ปดํ์ผ์ด ๋์ด์ ๊ธฐ์ฉ๋๋ค.
๋๋ ์์ ๊ฐ ์ค๋ฅ์ ์ฃผ์์ ๋ฌ์ง ์์ ๋ฒ์ญ์์ ์ดํดํฉ๋๋ค. ๋๋ try
๊ฐ ์ผ๋ฐ์ ์ธ ์ํฉ์์ ์ค๋ฅ ์ฃผ์์ ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์ค๋ฅ ์ฃผ์์ด ์ปค๋ฎค๋ํฐ์ ๋งค์ฐ ์ค์ํ๋ค๊ณ ์ฃผ์ฅํ๋ ค๊ณ ํ์ต๋๋ค. ์ง๊ธ๊น์ง ์ฃผ์์ ์๋น ๋ถ๋ถ์ try
์ ๋ ๋์ ์ฃผ์ ์ง์์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ์ํ์ต๋๋ค.
์ค๋ฅ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ์ ์ ๋ํด์๋ ํจ์์ ๊ด์ฌ์ด ๋๋ฌด ๊ด๋ฒ์ํ๋ค๋ ์ ํธ๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ์ฃผ์์์ ์ฃผ์ฅ๋ ์ค์ ์ฝ๋์ ๋ช ๊ฐ์ง ์๋ฅผ ๋ฒ์ญํ๊ณ ๋ด ์๋ ์ฃผ์ ์ ๋งจ ์๋์ ์๋ ๋๋กญ๋ค์ด์ ๋ฐฐ์นํ๊ณ https://github.com/golang/go/issues/32437#issuecomment ์ ์ - 499007288 ์ ์๊ฐ์๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ๋ณด์ฌ์ค๋๋ค.
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil { return nil, errors.WithMessage(err, "load config dir") }
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err != nil { return nil, errors.WithMessage(err, "execute main template") }
buf, err := format.Source(b.Bytes())
if err != nil { return nil, errors.WithMessage(err, "format main template") }
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
// ...
}
์ด ํจ์์ ๋ชฉ์ ์ ์ผ๋ถ ๋ฐ์ดํฐ์ ๋ํ ํ ํ๋ฆฟ์ ํ์ผ๋ก ์คํํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ถํ ๋ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ, ๊ทธ๋ฌํ ๋ชจ๋ ์ค๋ฅ๊ฐ ์ง์ฐ์์ ์์ฑ๋ ๋ผ์ธ์ ์ป์ ๊ฒฝ์ฐ ๋ถํํ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์์๊ฒ๋ ๊ด์ฐฎ์์ง ๋ชจ๋ฅด์ง๋ง ์ฌ์ฉ์์๊ฒ๋ ํจ์ฌ ๋ ์ ์ฉํฉ๋๋ค.
defer wrap(&err, "message: %v", err)
๋ฒ๊ทธ๊ฐ ์ผ๋ง๋ ๋ฏธ๋ฌํ๊ณ ๊ฒฝํ์ด ํ๋ถํ Go ํ๋ก๊ทธ๋๋จธ๋ ๋์ด์ง๊ฒ ๋์๋์ง ์ฝ๊ฐ์ ์ ํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด ์ฃผ์ฅ์ ์์ฝํ์๋ฉด ์ค๋ฅ ์ฃผ์์ด ํํ์ ๊ธฐ๋ฐ ์ค๋ฅ ๊ฒ์ฌ๋ณด๋ค ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ฉฐ ๋ช ๋ น๋ฌธ ๊ธฐ๋ฐ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ธ ์ค ๋์ ํ ์ค๋ก ํ์ฉํจ์ผ๋ก์จ ์๋นํ ๋ ธ์ด์ฆ ๊ฐ์๋ฅผ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ฌ ํด์.
@griesemer ์ฃ์กํฉ๋๋ค. ๊ณตํฉ์ ๋ํด ๋ ผ์ํ๊ณ ์ํ์ ๋ํ ํ ๋ก ์ ๋ณด์ง ๋ชปํ ๋ค๋ฅธ ์น์ ์ ์ฝ์์ต๋๋ค.
@zeebo ์ด ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด ๊ฒฝ์ฐ if
๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ ํ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ์ ๋งํ์๋ฉด, if๋ฅผ ํ ์ค๋ก ํ์ํํ๋ฉด ์ด๊ฒ์ ์กฐ๊ธ ๊ฐ์ํํ ์ ์์ต๋๋ค.
try
์ ๋ํ ๋ ๋ฒ์งธ ์ธ์๋ก ํธ๋ค๋ฌ์ ๋ํ ์์ด๋์ด๋ฅผ ๋ค์ ํ ๋ฒ ์ธ๊ธํ๊ณ ์ถ์ง๋ง ํธ๋ค๋ฌ ์ธ์๋ _required_์ด์ง๋ง nil-able์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ธ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๊ธฐ๋ณธ๊ฐ์ด ๋ฉ๋๋ค. ์ค๋ฅ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ๋ฌํ๋ ค๋ ๊ฒฝ์ฐ ํธ๋ค๋ฌ์ nil ๊ฐ์ ์ ๊ณตํ๊ธฐ๋ง ํ๋ฉด try
๊ฐ ์๋ ์ ์์์์ ๊ฐ์ด ๋์ํ์ง๋ง nil ์ธ์๋ ์ค๋ฅ๊ฐ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ์ฝ๋ ๊ฒํ ์ค์ ์ก๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์
๋๋ค.
file := try(os.Open("my_file.txt"), nil)
ํธ๋ค๋ฌ๊ฐ ์ ๊ณต๋์์ง๋ง nil์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ํจ๋์ ์๋ํ๊ฑฐ๋ ๋ถ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๊น?
์์์ ์ธ๊ธํ๋ฏ์ด try
์ ์๋ ์ ์์ ๋ฐ๋ผ ์๋ํฉ๋๋ค. ๋ถ์ฌ ์ค๋ฅ ํธ๋ค๋ฌ ๊ฐ์ ๊ฒ์ ์๊ณ ์ค์ง ํ๋๋ฟ์
๋๋ค.
ํธ๋ค๋ฌ๊ฐ nil์ด ์๋ ์ค๋ฅ๋ก ํธ์ถ๋ ๋ค์ nil ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๊ฒ์ ์ค๋ฅ๊ฐ "์ทจ์๋จ"์ ์๋ฏธํฉ๋๊น? ์๋๋ฉด ๋๋ฌ์ธ๋ ํจ์๊ฐ nil ์ค๋ฅ์ ํจ๊ป ๋ฐํ๋์ด์ผ ํฉ๋๊น?
๋๋ ๋๋ฌ์ธ๋ ํจ์๊ฐ nil ์ค๋ฅ์ ํจ๊ป ๋ฐํ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. try
๊ฐ nil์ด ์๋ ์ค๋ฅ ๊ฐ์ ๋ฐ์ ํ์๋ ์คํ์ ๊ณ์ํ ์ ์๋ค๋ฉด ์ ์ฌ์ ์ผ๋ก ๋งค์ฐ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ถ ์ํฉ์์ ํธ๋ค๋ฌ๊ฐ ์ค๋ฅ๋ฅผ "์ฒ๋ฆฌ"ํ ์ ์์ต๋๋ค. ์ด ๋์์ ์๋ฅผ ๋ค์ด "๊ฐ์ ธ์ค๊ธฐ ๋๋ ๋ง๋ค๊ธฐ" ์คํ์ผ ํจ์์์ ์ ์ฉํ ์ ์์ต๋๋ค.
func getOrCreateObject(obj *object) error {
defaultObjectHandler := func(err error) error {
if err == ObjectDoesNotExistErr {
*obj = object{}
return nil
}
return fmt.Errorf("getting or creating object: %v", err)
}
*obj = try(db.getObject(), defaultObjectHandler)
}
๋ํ ์ ํ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ ํ ๋ฌด์ํ๊ฒ ๋ ์ง ์ฌ๋ถ๋ ๋ถ๋ช ํ์ง ์์์ต๋๋ค. ๋ํ ๋ชจ๋ ๊ณณ์์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์์ง๋ง ์๋๋ฅผ ํ ๋ฒ๋ง ๋์น๊ฒ ๋ฉ๋๋ค. ๊ธฐํ ๋ฑ๋ฑ.
ํธ๋ค๋ฌ๋ฅผ nil-able ํ์ ์ธ์๋ก ๋ง๋ค๋ฉด ์ด๋ฌํ ๋ ๊ฐ์ง ์ฐ๋ ค๊ฐ ๋ชจ๋ ์ํ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ๊ฒ์ด๋ผ๋ ์์์ ์ด๊ณ ๋ช ์์ ์ธ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํฉ๋๋ค.
๋ณด๋์ค๋ก, ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์๊ตฌํ๋ ๊ฒ๋ ๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๊น๊ฒ ์ค์ฒฉ๋ try
๋ฅผ ๊ถ์ฅํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฐ๊ฐ๋ ์ด๊ฒ์ ๋จ์ ์ผ๋ก ์๊ฐํ ์๋ ์์ง๋ง ๋๋ ์ด๊ฒ์ด ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@velovix ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง๋ง ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก nil
๊ฐ ๋ ์ ์๋์? ์ "์๊ฐ์ ๋จ์"๊ฐ ํ์ํ๊ฐ์?
@griesemer @velovix ์์ด๋์ด๊ฐ ์ฑํ๋์์ง๋ง builtin
์ err ์ ํจ๋์ผ๋ก ๋ณํํ๋ ์ฌ์ ์ ์๋ ํจ์๊ฐ ํฌํจ๋์ด ์๊ณ ์ง๋์น๊ฒ ์ค์ํ ํจ์์ ์ค๋ฅ ๋ฐํ ๊ฐ์ด ์์ด์ผ ํ๋ค๋ ์๊ตฌ ์ฌํญ์ ์ ๊ฑฐํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ฐ์ฅ ์ค์ํ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ๊ฒฝ์ฐ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ์์ด try
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ ๋ช
๋ช
๋ ๋ฐํ๋ ์ค๋ฅ๋ฅผ ์์ ํ๋ ๋งจ ์์ ์๋ defer
๋์ ์ค๋ฅ ์์น์์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ์ฌ์ฉํ์ฌ ๊ณง ๋ฐํ๋ ์ค๋ฅ๋ฅผ ๋ํํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
@pjebs
์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก nil์ด ๋ ์ ์๋์? ์ "์๊ฐ์ ๋จ์"๊ฐ ํ์ํ๊ฐ์?
ํ๋ ์ฐ๋ ค๋ฅผ ํด์ํ๊ธฐ ์ํจ์ด๋ค.
try
์ ์์ ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ์ค๋ฅ์ ๋ํ ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ฐฉํดํ ์ ์์ต๋๋ค.์ฒ์์ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ ์คํธ๋ฅผ ๋ ์ฝ๊ฒ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ํธ๋ค๋ฌ๋ฅผ ํ์ ์ธ์๋ก ์ฌ์ฉํ๋ฉด ๋ฉ์์ง๊ฐ ์ ์ก๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ๊ฒฝ์ฐ๋ ์ค๋ฅ๋ฅผ ๋จ์ํ ์คํ ์๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ปจํ ์คํธํํ๋ ๊ฒ์ ๋๋ค. Go ์ปค๋ฎค๋ํฐ์ ์ผ๋ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ๊ณผ ์ผ์นํฉ๋๋ค.
๋ํ ์ ํ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ ํ ๋ฌด์ํ๊ฒ ๋ ์ง ์ฌ๋ถ๋ ๋ถ๋ช ํ์ง ์์์ต๋๋ค. ๋ํ ๋ชจ๋ ๊ณณ์์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์์ง๋ง ์๋๋ฅผ ํ ๋ฒ๋ง ๋์น๊ฒ ๋ฉ๋๋ค. ๊ธฐํ ๋ฑ๋ฑ.
๋ช
์์ ์ธ nil
๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒ์ ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ธ์๋ฅผ ์๋ตํ์ฌ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ก ๋ช
์์ ์ผ๋ก ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -498947603์์ ๊ฐ๋ตํ๊ฒ ์ธ๊ธ๋ ์กฐ๊ฑด๋ถ ๋ฐํ์ ๋ํด ๋ ์๊ฐํด๋ณด์ธ์.
๊ฒ ๊ฐ๋ค
return if f, err := os.Open("/my/file/path"); err != nil
Go์ ๊ธฐ์กด if
๋ชจ์๊ณผ ๋ ํธํ๋ฉ๋๋ค.
return if
๋ฌธ์ ๋ํ ๊ท์น์ ์ถ๊ฐํ๋ฉด
err != nil
์ ๊ฐ์ ๋ง์ง๋ง ์กฐ๊ฑด ํํ์์ด ์์ ๋,return if
๋ฌธ์ ๋ง์ง๋ง ๋ณ์๋ error
์ ํ์
๋๋ค.๊ทธ๋ฌ๋ฉด ๋ง์ง๋ง ๋ณ์์ ๊ฐ์ด ์์์ ์กฐ๊ฑด์ผ๋ก nil
์ ์๋์ผ๋ก ๋น๊ต๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด return if
๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ฝ๋ ์ ์์ต๋๋ค.
return if f, err := os.Open("my/file/path")
try
๊ฐ ์ ๊ณตํ๋ ์ ํธ-์ก์ ๋น์จ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค.
return if
๋ฅผ try
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
try f, err := os.Open("my/file/path")
์ด๊ฒ์ ์ ์ด๋ ๊ตฌ๋ฌธ์ ์ผ๋ก๋ ์ด ์ค๋ ๋์์ ์ ์๋ ๋ค๋ฅธ try
๋ณํ๊ณผ ๋ค์ ์ ์ฌํด์ง๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด ๊ฒฝ์ฐ try
return if
๋ฅผ ์ ํธํฉ๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ด ํจ์์ ์ข
๋ฃ์ ์ ๋งค์ฐ ๋ช
์์ ์ผ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋๋ฒ๊น
ํ ๋ ๋๋ ์ข
์ข
ํธ์ง๊ธฐ ๋ด์์ ํค์๋ return
๋ฅผ ๊ฐ์กฐ ํ์ํ์ฌ ํฐ ํจ์์ ๋ชจ๋ ์ข
๋ฃ์ ์ ์๋ณํฉ๋๋ค.
๋ถํํ๋ ๋๋ฒ๊ทธ ๋ก๊น
์ ์ฝ์
ํ๋ ๋ถํธํจ์๋ ์ถฉ๋ถํ ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
return if
body
๋ธ๋ก๋ ํ์ฉํ์ง ์๋ ํ ๋ค์๊ณผ ๊ฐ์ด
์๋์:
return if f, err := os.Open("my/path")
๋๋ฒ๊น ํ ๋:
- return if f, err := os.Open("my/path")
+ return if f, err := os.Open("my/path") {
+ fmt.Printf("DEBUG: os.Open: %s\n", err)
+ }
return if
์ ๋ณธ๋ฌธ ๋ธ๋ก์ ์๋ฏธ๋ ๋ถ๋ช
ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. defer
์ ์ ์คํ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
์ฆ, Go์ ๊ธฐ์กด ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ถ๋ง์ด ์์ต๋๋ค.
์๋ก์ด ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ถ๊ฐ๊ฐ ํ์ฌ Go์ ์ฅ์ ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ๋ ๊ฑฑ์ ๋ฉ๋๋ค.
@velovix ์ฐ๋ฆฌ๋ ๋ช
์์ ํธ๋ค๋ฌ ํจ์๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํ๋ try
์์ด๋์ด๊ฐ ์๋นํ ๋ง์์ ๋ค์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๊ณ ๋ฌธ์์ ๋์ ์๋ ๊ฒ์ฒ๋ผ ๋ช
ํํ ๋ต์ด ์๋ ์ง๋ฌธ์ด ๋๋ฌด ๋ง์์ต๋๋ค. ๋น์ ์ ๋น์ ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด๋ ๋ฐฉ์์ผ๋ก ๊ทธ๋ค ์ค ์ผ๋ถ์ ๋๋ตํ์ต๋๋ค. ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์ ๋ต์ด ์์ ํ ๋ค๋ฅธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ Go ํ ๋ด์์์ ์ฐ๋ฆฌ์ ๊ฒฝํ์ด์์ต๋๋ค). ์๋ฅผ ๋ค์ด, ํธ๋ค๋ฌ ์ธ์๋ ํญ์ ์ ๊ณต๋์ด์ผ ํ์ง๋ง nil
์ผ ์ ์๋ค๊ณ ๋ช
์ํ๊ณ ์์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์ด์ ํจ์ ๊ฐ( nil
๋ฆฌํฐ๋ด์ด ์๋)์ ์ ๊ณตํ๊ณ ํด๋น ํจ์ ๊ฐ(๋ณ์์ ์ ์ฅ๋)์ด nil์ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ช
์์ nil
๊ฐ๊ณผ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๊ฒ์ด ์ฝ๋์ ๋ฒ๊ทธ๋ผ๊ณ ์ฃผ์ฅํ ์ ์์ต๋๋ค. ๋๋ nil ๊ฐ ์ฒ๋ฆฌ๊ธฐ ์ธ์๋ฅผ ํ์ฉํ ์ ์์ง๋ง ํจ์๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ผ๊ด์ฑ ์์ด ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ฒ๋ฆฌํ์ง ์์ ์ ์์ผ๋ฉฐ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํญ์ ์กด์ฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ํํ๋ ์ฝ๋์์ ๋ฐ๋์ ๋ช
ํํ์ง๋ ์์ต๋๋ค. . ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋งค์ฐ ๋ช
ํํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ต์์ ์ ์ธ์ ๊ฐ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ defer
. ์๋ง ๋ ์์ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค๋ฅ๋ฅผ ํ ์คํธํ๊ธฐ ์ํด if ๋ฌธ์ ์ฌ์ฉํ๋ ํ์ฌ ์ฝ๋ฉ ์คํ์ผ์ ์ต๋ํ ๋ช ์์ ์ ๋๋ค. ๊ฐ๋ณ์ ์ผ๋ก(๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ๋ํด) ์ค๋ฅ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ข ์ข ํจ์์์ ๊ฐ์ง๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๊ท ์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ์ด๋ ์ฐ๊ธฐ๋ก ์ํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ๊ฐ๋ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ธ์ด์์ ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค๊ณผ ์ฒ๋ฆฌ๊ธฐ ๊ตฌ์ฑ์ด ์ง์ฐ์ ์ง๊ตํ์ง ์๋ ๋ฌธ์ ๋ก ์ธํด ์ค๋ฅ๋ฅผ ๋ณด๊ฐํ๊ธฐ ์ํ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ ๊ทธ๋ฅ ๋๊ฒ ๋์์ต๋๋ค.
@griesemer - IIUC, ํธ์ถ ์ฌ์ดํธ ์ข
์ ์ค๋ฅ ์ปจํ
์คํธ์ ๊ฒฝ์ฐ ํ์ฌ if ๋ฌธ์ด ๊ด์ฐฎ๋ค๊ณ ํฉ๋๋ค. ๋ฐ๋ฉด์ ์ด ์๋ก์ด try
ํจ์๋ ํ ๊ณณ์์ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
๋จ์ํ if err != nil { return err}
๋ฅผ ์ํํ๋ ๊ฒ์ด ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ฐํํ๊ธฐ ์ ์ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ์์ ์ ์๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ํ์์๋ ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ์ฌ๋๋ค์ด ์ฌ์ด ๋ฐํ ํจํด์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@agnivade ๋ง์ต๋๋ค. ์ด ์ ์์ ์ค๋ฅ ์ฅ์์ ์ ํ ๋์์ด ๋์ง ์์ต๋๋ค(๊ทธ๋ฌ๋ defer
์ฌ์ฉ์ ๊ถ์ฅํ๊ธฐ ์ํ ๊ฒ์
๋๋ค). ํ ๊ฐ์ง ์ด์ ๋ ์ด์ ๋ํ ์ธ์ด ๋ฉ์ปค๋์ฆ์ด ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ ๊ฐ๋ณ ์ค๋ฅ ๊ธฐ์ค์ผ๋ก ์ค๋ฅ ๋ฐ์ฝ๋ ์ด์
์ด ํ์ํ ์ฆ์ ๋ฐ์ฝ๋ ์ด์
์ฝ๋์ ๋ํ ์ถ๊ฐ ์์ค ํ
์คํธ ์์ด ๋น๊ตํ์ฌ if
๋ฅผ ๋ ๋ถ๋ด์ค๋ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ฅ์์ด ํ์ํ์ง ์๊ฑฐ๋ ์ฅ์์ด ํญ์ ๋์ผํ ๊ฒฝ์ฐ ์์ฉ๊ตฌ๊ฐ ๋์ ๋ณด์ด๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋์ด ์ค์ํ ์ฝ๋๋ฅผ ์์์ํค๋ ๊ฒฝ์ฐ์
๋๋ค.
์ฌ๋๋ค์ ์ด๋ฏธ ์ฌ์ด ๋ฐํ ํจํด์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๊ณ ์์ต๋๋ค. try
๋๋ try
, ์ธ ๊ฒ์ด ์ ์ต๋๋ค. ์๊ฐํด ๋ณด๋ฉด _์ค๋ฅ ์ฅ์์ ์ฅ๋ คํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋ฌดํํ๋ ๊ฒ์
๋๋ค_. ์ด๋ค ์ธ์ด ์ง์์ ์ฌ์ฉํ ์ ์๋๋ผ๋ ์ค๋ฅ ์ฅ์์๋ ๋ ๋ง์ ์์
์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฑฐ๋๋ฅผ ๋ถ๋๋ฝ๊ฒ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ try
(๋๋ ์ ์ฌํ ๋จ์ถํค ํ๊ธฐ๋ฒ)์ ๊ฐ์ ๊ฒ์ ํ์ฉํ๋ ๊ฒ์
๋๋ค. _if_ ๋ช
์์ (๋น์ด ์์ ์ ์์) ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ด๋๊ฐ์ ์ ๊ณต๋ฉ๋๋ค(์๋ ์ด์ ๋์์ธ ์๋ ์ด๋ฌํ ์๊ตฌ ์ฌํญ).
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๊ฐ๊ณ ์ถ์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๋ถ์ ๊ฐ์ด ์๋ฒฝํ๊ฒ ํ๋ฅญํ ๋ง์ ์ฝ๋๊ฐ ๋ชจ๋ ๊ณณ์์ ์ค๋ฅ๋ฅผ ์ฅ์ํ ํ์๊ฐ ์๋ค๋ ์ ์ ๋ค์ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ฅ๊ฐ API ์ง์ ์ ์ ๋ ๋๊ธฐ ์ง์ ์ ์ค๋ฅ๋ฅผ ์ ํํ๊ณ ์ฅ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. (์ฌ์ค, ๊ทธ๊ฒ๋ค์ ์ด๋์์๋ ์ฅ์ํ๋ ๊ฒ์ ์ง์ง ๋ฒ์ธ์ด ์จ๊ฒจ์ ธ ์๋ ์ํ์์ ์ค์ํ ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ณผ๋ํ๊ฒ ์ฅ์๋ ์ค๋ฅ๋ก ์ด์ด์ง ๋ฟ์ ๋๋ค. ๋ง์น ์ง๋์น๊ฒ ์ฅํฉํ ๋ก๊น ์ด ์ค์ ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ณด๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ๊ณผ ๋งค์ฐ ํก์ฌํฉ๋๋ค.)
์ข์ ์์ด ๋ catch ํจ์๋ฅผ ์ถ๊ฐํ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
func a() int {
x := randInt()
// let's assume that this is what recruiters should "fix" for us
// or this happens in 3rd-party package.
if x % 1337 != 0 {
panic("not l33t enough")
}
return x
}
func b() error {
// if a() panics, then x = 0, err = error{"not l33t enough"}
x, err := catch(a())
if err != nil {
return err
}
sendSomewhereElse(x)
return nil
}
// which could be simplified even further
func c() error {
x := try(catch(a()))
sendSomewhereElse(x)
return nil
}
์ด ์์์ catch()
๋ recover()
ํจ๋ ๋ฐ return ..., panicValue
์
๋๋ค.
๋ฌผ๋ก , ์ฐ๋ฆฌ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ func๊ฐ ์๋ ๋ช
๋ฐฑํ ์ฝ๋ ์ผ์ด์ค๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ค๋ฅ ๊ฐ์ ๊ทธ๋ฅ ํต๊ณผํ๋ ๊ฒ์ด ํธ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก catch()๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ก ํจ๋์ ๋ณต๊ตฌํ๊ณ ์ค๋ฅ๋ก ์ ํํ ์ ์์ต๋๋ค.
Go๋ ์ค์ ๋ก ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋์๊ฒ ๊ฝค ์ฌ๋ฏธ์์ด ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ๊ฝค ๊น๋ํ try()-catch() ํจํด์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ํ Java( catch(Throwable)
in Main + throws LiterallyAnything
). ์ผ๋ฐ์ ์ธ ์ค๋ฅ์ฒ๋ผ ๋๊ตฐ๊ฐ์ ํจ๋์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ์ฌ ๋ด ํ์ฌ ํ๋ก์ ํธ์์ Go์ ์ฝ 6๋ฐฑ๋ง ๊ฐ ์ด์์ LoC๊ฐ ์์ผ๋ฉฐ, ์ด๊ฒ์ด ์ ์ด๋ ์ ์๊ฒ๋ ์ผ์ ๋จ์ํํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@griesemer ํ ๋ก ์ ์์ฝํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๊ฑฐ๊ธฐ์ ํ ๊ฐ์ง ์์ ์ด ๋น ์ก๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ ์ฐ๋ฆฌ๊ฐ ์ ๋ค๋ฆญ์ ๊ฐ์ง ๋๊น์ง ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๋ณด๋ค ์ฐ์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ํ @velovix ์ ์ ์๋ ๋ง์์ ๋ค๊ณ ์ฌ์์ ์ค๋ช ๋ ๋๋ก ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์ ๊ธฐ๋๋ค๋ ์ ์ ๊ฐ์ฌํ์ง๋ง @velovix ๊ฐ ์ด๋ฏธ ํ ๊ฒ์ฒ๋ผ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ๋ต๋ณํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
ํจ์ ๊ฐ(nil ๋ฆฌํฐ๋ด์ด ์๋)์ ์ ๊ณตํ๊ณ ํด๋น ํจ์ ๊ฐ(๋ณ์์ ์ ์ฅ๋จ)์ด nil์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? => ์ค๋ฅ ์ฒ๋ฆฌํ์ง ๋ง์ธ์, ๋ง์นจํ. ์ด๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ปจํ ์คํธ์ ์์กดํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ํธ๋ค๋ฌ ๋ณ์๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์ ๋๋ค. :)
๋ ๋ค๋ฅธ ์ฃผ์ฅ์ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋งค์ฐ ๋ช ํํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ต์์ ์ ์ธ์ ๊ฐ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ๋๋ค. => ๋ฐ๋ผ์ ํจ์์ ์๋จ์ ์๋ ์๋ฌ ํธ๋ค๋ฌ๋ฅผ ๋ช ๋ช ๋ ํด๋ก์ ํจ์๋ก ์ ์ํ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ฉด ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ๋ ๋งค์ฐ ๋ช ํํด์ง๋๋ค. ์ด๊ฒ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๋๋ผ ์คํ์ผ ์๊ตฌ ์ฌํญ์ ๋๋ค.
๋ ์ด๋ค ๊ณ ๋ฏผ์ด ์์๋์? ๋๋ ๊ทธ๋ค์ด ํฉ๋ฆฌ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ๋น์ทํ๊ฒ ๋๋ตํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋น์ ์ด ๋งํ๋ฏ์ด "๊ฑฐ๋๋ฅผ ๋ถ๋๋ฝ๊ฒ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ช ์์ (๋น์ด ์์ ์ ์๋) ํธ๋ค๋ฌ๊ฐ ์ด๋๊ฐ์ ์ ๊ณต๋๋ ๊ฒฝ์ฐ์๋ง try(๋๋ ์ ์ฌํ ๋จ์ถํค ํ๊ธฐ๋ฒ)์ ๊ฐ์ ๊ฒ์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค." ์ฐ๋ฆฌ๊ฐ ์ด ์ ์์ ๊ณ์ ์งํํ๋ ค๋ฉด ์ค์ ๋ก "์ฌ๊ธฐ๊น์ง" ๋ฐ์๋ค์ฌ์ผ ํ๊ณ "๋ช ์์ ์ธ ๊ฒ์ด ์์์ ์ธ ๊ฒ๋ณด๋ค ๋ซ๋ค"๋ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฅ๋ คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@griesemer
์ด์ ํจ์ ๊ฐ(nil ๋ฆฌํฐ๋ด์ด ์๋)์ ์ ๊ณตํ๊ณ ํด๋น ํจ์ ๊ฐ(๋ณ์์ ์ ์ฅ๋)์ด nil์ด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ช ์์ nil ๊ฐ๊ณผ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๊ฒ์ด ์ฝ๋์ ๋ฒ๊ทธ๋ผ๊ณ ์ฃผ์ฅํ ์ ์์ต๋๋ค.
์ด๋ก ์ ์ผ๋ก ์ด๊ฒ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด์ง๋ง ํธ๋ค๋ฌ๊ฐ ์ฐ์ฐํ 0์ด ๋๋ ํฉ๋ฆฌ์ ์ธ ์ํฉ์ ๊ฐ๋ ํํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ํธ๋ค๋ฌ๋ ๋ค๋ฅธ ๊ณณ์์ ์ ์๋ ์ ํธ๋ฆฌํฐ ํจ์๋ ํจ์ ์์ฒด์ ์ ์๋ ํด๋ก์ ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์๊ธฐ์น ์๊ฒ 0์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ํธ๋ค๋ฌ ํจ์๊ฐ ๋ค๋ฅธ ํจ์์ ๋ํ ์ธ์๋ก ์ ๋ฌ๋๋ ์๋๋ฆฌ์ค๊ฐ ์์ ์ ์์ง๋ง ๋ด ๋์๋ ๋ค์ ๋ฌด๋ฆฌํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ด๊ฐ ๋ชจ๋ฅด๋ ์ด๋ฐ ํจํด์ด ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
๋ ๋ค๋ฅธ ์ฃผ์ฅ์ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋งค์ฐ ๋ช ํํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ต์์ ์ ์ธ์ ๊ฐ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์
defer
.
@beoran์ด ์ธ๊ธํ๋ฏ์ด ํธ๋ค๋ฌ๋ฅผ ํจ์ ์๋จ ๊ทผ์ฒ์ ํด๋ก์ ๋ก ์ ์ํ๋ ๊ฒ์ ์คํ์ผ์ด ๋งค์ฐ ์ ์ฌํ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ์ฌ๋๋ค์ด ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ํจ์๊ฐ defer
๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ์ํด ์ป์ ๋ช
ํ์ฑ์ ๊ฐ์ฌํ์ง๋ง ํจ์๊ฐ ํจ์์ ์ค๊ฐ์ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์์ ํผ๋ฒํด์ผ ํ ๋ ๋ช
ํํ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๊ฐ์ defer
๊ฐ ํ์๋๋ฉฐ ๋
์๋ ์๋ก ์ด๋ป๊ฒ ์ํธ ์์ฉํ ์ง ์ถ๋ก ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํธ๋ค๋ฌ ์ธ์๊ฐ ๋ ๋ช
ํํ๊ณ ์ธ์ฒด๊ณตํ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ์ํฉ์ด๋ฉฐ ์ด๊ฒ์ด _์๋์ ์ผ๋ก_ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๊ดํธ ์์ด ์๋ํ๊ฒ ํ ์ ์์ต๋๊น?
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
a := try func(some)
@Cyberax - ์์์ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ๊ฒ์ํ๊ธฐ ์ ์ ๋์์ธ ๋ฌธ์๋ฅผ ์ฃผ์ ๊น๊ฒ ์ฝ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๊ฒ์ ํธ๋ํฝ์ด ๋ง์ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ๋๋ค์ด ๊ตฌ๋ ํ์ต๋๋ค.
๋ฌธ์๋ ์ฐ์ฐ์์ ํจ์์ ๋ํด ์์ธํ ์ค๋ช ํฉ๋๋ค.
8์ ๋ฒ์ ๋ณด๋ค ์ด๊ฒ ๋ ๋ง์์ ๋ญ๋๋ค.
return
ํค์๋๊ฐ ์๋ ๋ฐํ์ ๋ํด ์์ ํ ๋ฐ๋๋๋ ๊ฒ์ ์๋ ๋ถ์ ์ ์ธ ํผ๋๋ฐฑ์ ๋๋ถ๋ถ์ ๋ ๊ฐ์ง๋ก ์์ฝ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์์ ์ฐธ์กฐํ์ญ์์ค.
์ด ๋ ๊ฐ์ง ๋ฐ๋ก ์ ๋ํ ๋ฐ๋ฐ์ ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค.
try
๋ฅผ ์ฌ์ฉํ๊ฒ ๋ง๋ค์ง ์์ ๊ฒ์
๋๋ค. " / 100% ๊ฒฝ์ฐ์ ์ ํฉํ์ง ์์ ๊ฒ์
๋๋ค.๋๋ 1์ ๋ํด ์ ๋ง๋ก ํ ๋ง์ด ์์ต๋๋ค(๋๋ ๊ทธ๊ฒ์ ๋ํด ๊ฐํ๊ฒ ๋๋ผ์ง ์์ต๋๋ค). ๊ทธ๋ฌ๋ 2์ ๊ดํด์๋ 8์ ์ ์์๋ ์ด ๋ฌธ์ ๊ฐ ์์๊ณ ๋๋ถ๋ถ์ ๋ฐ๋ ์ ์์๋ ์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
ํนํ tryf
๋ฐ๋ ์ ์(์ด ์ค๋ ๋์์ ๋
๋ฆฝ์ ์ผ๋ก ๋ ๋ฒ ๊ฒ์๋จ)์ด๋ try(X, handlefn)
๋ฐ๋ ์ ์(์ค๊ณ ๋ฐ๋ณต์ ์ผ๋ถ์) ๋ชจ๋ ์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
try
๊ฐ ๊ด๋ จ ์ปจํ
์คํธ๋ก ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๋ ๊ฒ์์ ๋ฒ์ด๋ ํ๋์ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ๋ณ ์ค๋ฅ ์ฅ์์ผ๋ก ์ฌ๋๋ค์ ๋ฐ์ด๋ผ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฉฐ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ์ ์ํ๊ณ ์ ํฉ๋๋ค.
defer
์ ๋งค๊ฐ๋ณ์๋ ํจ์ ๋๋ ๋ฉ์๋ ํธ์ถ๋ง ๊ฐ๋ฅํฉ๋๋ค. defer
๊ฐ ํจ์ ์ด๋ฆ์ด๋ ํจ์ ๋ฆฌํฐ๋ด๋ ๊ฐ์ง ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ฆ,defer func(...) {...}
defer packageName.functionName
ํจ๋ ๋๋ ์ง์ฐ์ด ์ด๋ฌํ ์ ํ์ ์ง์ฐ์ ๋ง๋๋ฉด ๋ชจ๋ ๋งค๊ฐ๋ณ์์ ๋ํด 0 ๊ฐ์ ์ ๋ฌํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
try
์ ๋ ์ด์์ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉ
try
๊ฐ ์๋ก์ด ์ ํ์ defer๋ฅผ ๋ง๋๋ฉด ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ๋ชจ๋ try
์ ๊ณ ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฐ๋ฅด๋ ์ค๋ฅ ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func errorfn() error {
return errors.New("an error")
}
func f(fail bool) {
defer func(err *error, a, b, c int) {
fmt.Printf("a=%d b=%d c=%d\n", a, b, c)
}
if fail {
try(errorfn, 1, 2, 3)
}
}
๋ค์๊ณผ ๊ฐ์ ์ผ์ด ์ผ์ด๋ ๊ฒ์ ๋๋ค:
f(false) // prints "a=0 b=0 c=0"
f(true) // prints "a=1 b=2 c=3"
@zeebo์ https://github.com/golang/go/issues/32437#issuecomment -499309304 ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
func (c *Config) Build() error {
defer func(err *error, msg string, args ...interface{}) {
if *err == nil || msg == "" {
return
}
*err = errors.WithMessagef(err, msg, args...)
}
pkgPath := try(c.load(), "load config dir")
b := bytes.NewBuffer(nil)
try(templates.ExecuteTemplate(b, "main", c), "execute main template")
buf := try(format.Source(b.Bytes()), "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
// ...
}
๊ทธ๋ฆฌ๊ณ ErrorHandlef๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค.
func HandleErrorf(err *error, format string, args ...interface{}) {
if *err != nil && format != "" {
*err = fmt.Errorf(format + ": %v", append(args, *err)...)
}
}
fmt
-์คํ์ผ ํ์ ๋ฌธ์์ด์ ํต์ฌ ์ธ์ด๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ๋ชจ๋ ์ฌ๋์ด ๋ง์ด ์ฐพ๋ tryf
๋ฅผ ๋ฌด๋ฃ๋ก ์ ๊ณตํฉ๋๋ค.
defer
๋ ์ธ์๋ก ํจ์ ํํ์์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค. ์๋ก์ด ํค์๋๋ฅผ ์๊ฐํ์ง ์์ต๋๋ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md ์ ์ค๋ช
๋ ๋ณ๊ฒฝ ์ฌํญ ์ธ์ ๊ตฌํํด์ผ ํ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try
์ ์ ๋ฌ๋ ๋งค๊ฐ๋ณ์๊ฐ defer
์ ์ ๋ฌ๋ ํจ์์ ์๋ช
๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋๋ก ์ ํ ๊ฒ์ฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.try
์ ๊ตฌํ์ ๋ณ๊ฒฝํ์ฌ ์๋ก์ด ์ข
๋ฅ์ ์ง์ฐ์ ์ํด ์ง์ฐ๋ ํธ์ถ์ ๋ง๋ ๋ ์ง์ฐ๋ ํธ์ถ์ ์ธ์๋ก ์ธ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.check/handle
๋๋ํํธ ๋์์ธ์ ๋ณต์ก์ฑ ์ดํ์ ์ด ํจ์ฌ ๋ ๊ฐ๋จํ๊ณ ์ค์ฉ์ ์ธ ์ ์์ด ์คํ๋๋ ๊ฒ์ ๋ณด๊ณ ๊ธฐ๋ถ ์ข๊ฒ ๋๋์ต๋๋ค.
๋ถ๋ช
ํ ๋ง์ ๋ฐ๋ฐ์ด ํ์ฌ์ ์ฅํฉํ ํํ์ ๋งค์ฐ ๋ง์กฑํ๊ณ ์ด๋ฅผ ์ํํ๊ธฐ ์ํ ์ ์์ ๋ณ๋ก ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. ๋๋จธ์ง ์ฐ๋ฆฌ๋ค์๊ฒ ์ด ์ ์์ ๋๋ฌด ๋ง์ ์ผ์ ํ์ง ์๊ณ try
์ธ ๊ฒฝ์ฐ ํญ์ ๋๋์๊ฐ ์ ์๋ ๊ธฐ์กด ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ์ ๊ณผ ์ ์ผ์นํ๋ ๋จ์ํ๊ณ Go-like์ ์ค์ํธ ์คํฟ์ ๋๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ช ๊ฐ์ง ํน์ ์ฌํญ์ ๋ํด:
์ ์์ ๋ํด ๋ด๊ฐ ์ซ์ดํ๋ ์ ์ผํ ์ ์ defer
๊ฐ ์ฌ์ฉ๋ ๋ ๋ช
๋ช
๋ ์ค๋ฅ ๋ฐํ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. ๋๋จธ์ง ์ธ์ด๊ฐ ์๋ํ๋ ๋ฐฉ์. ๋ฐ๋ผ์ ์ ์์ด ์ฑํ๋๋ฉด ์ด๋ฅผ ์์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
try
๊ฐ ์ค๋ฅ ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์์ ๋ํ ํ
์คํธ ํจํค์ง์ ์ ์๋ํ์ง ์๋ ๊ฒ์ ์ ๊ฐ์
๋๋ค. ์ด์ ๋ํ ๋ด๊ฐ ์ ํธํ๋ ์๋ฃจ์
์ nil์ด ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ฐํ๋๊ธฐ๋ณด๋ค๋ ํญ์ ํจ๋ ์ํ๊ฐ ๋๋ ๋ ๋ฒ์งธ ๋ด์ฅ ํจ์(์๋ง๋ ptry
๋๋ must
)๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค. ์์ ์ธ๊ธํ ๊ธฐ๋ฅ( main
ํฌํจ)๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์์ด๋์ด๋ ์ ์์์ ํ์ฌ ๋ฐ๋ณต์์ ๊ฑฐ๋ถ๋์์ง๋ง '๋ฐ์ ํ ์์ฒญ'์ด๋ผ๋ ์ธ์์ ๋ฐ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์ฌ๊ฒํ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋๋ ์ฌ๋๋ค์ด go try(f)
๋๋ defer try(f)
ํ๋ ์ผ์ ๋ํด ๋จธ๋ฆฌ๋ฅผ ์์ด๋ ๊ฒ์ด ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ๋ฐ๋ผ์ ๊ทธ๋ค์ ์์ ํ ๊ธ์งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
go fmt
๊ฐ if
๋ช
๋ น๋ฌธ์ ํ ์ค๋ก ๋ค์ ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ์กด ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ์ ์ด ๋ ์ฅํฉํด ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ์ฌ๋๋ค์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก, ๋๋ ์ด๊ฒ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ์ด ์๋ ์๋ _any_ ๋จ์ผ ๋ช
๋ น๋ฌธ if
์ ํ์ฉ๋๋ค๋ ๊ฐ๋จํ ๊ท์น์ ์ ํธํฉ๋๋ค. ์ฌ์ค ๋๋ ์ ์ธ์ด ํ์ฉ๋๋ ๊ฒ๊ณผ ๊ฐ์ ์ค์ ๋ณธ๋ฌธ์ด ๋ฐฐ์น๋๋ ๋จ์ผ ์ค ํจ์๋ฅผ ์์ฑํ ๋ ์ด๊ฒ์ด ํ์ฌ ํ์ฉ๋์ง ์๋ ์ด์ ๋ฅผ ๊ฒฐ์ฝ ์ดํดํ ์ ์์์ต๋๋ค.
์ฅ์ ์ค๋ฅ์ ๊ฒฝ์ฐ
func myfunc()( err error){
try(thing())
defer func(){
err = errors.Wrap(err,"more context")
}()
}
์ด๊ฒ์ ๊ธฐ์กด ํจ๋ฌ๋ค์๋ณด๋ค ํจ์ฌ ๋ ์ฅํฉํ๊ณ ๊ณ ํต์ค๋ฝ๊ฒ ๋๊ปด์ง๋ฉฐ ๊ฒ์ฌ/ํธ๋ค๋งํผ ๊ฐ๊ฒฐํ์ง ์์ต๋๋ค. ๋ํ๋์ง ์์ try() ๋ณํ์ด ๋ ๊ฐ๊ฒฐํ์ง๋ง ์ฌ๋๋ค์ด try์ ์ผ๋ฐ ์ค๋ฅ ๋ฐํ์ ํผํฉํ์ฌ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. try์ ๊ฐ๋จํ ์ค๋ฅ ๋ฐํ์ ํผํฉํ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๋ ๋ฐ ์์ ํ ๋งค๋ฃ๋์์ต๋๋ค(Is/As๋ฅผ ๊ธฐ๋ํฉ๋๋ค). ์ด๊ฒ์ด ๊ตฌ๋ฌธ์ ์ผ๋ก ๊น๋ํ์ง๋ง ์ค์ ๋ก ์ฌ์ฉํ๊ณ ์ถ์์ง ํ์ ์ด ์์ง ์๋๋ค๊ณ ์๊ฐํ๊ฒ ๋ง๋์ญ์์ค. check/handle์ ๋ด๊ฐ ๋ ์ฒ ์ ํ๊ฒ ์์ฉํ ๋ฌด์ธ๊ฐ๋ฅผ ๋๊ผ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋จ์์ฑ๊ณผ "ํ ๊ฐ์ง๋ง ์ ํ๋ผ"๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๋ง ์ข์ํฉ๋๋ค. ๋ด GoAWK ์ธํฐํ๋ฆฌํฐ์์๋ ๋งค์ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค. ์ ๋ ์ฝ 100๊ฐ์ if err != nil { return nil }
๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ ์๋นํ ์์ ์ฝ๋๋ฒ ์ด์ค์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ํค์๋๊ฐ ์๋ ๋ด์ฅ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ํ ์ ์์ ์ ๋น์ฑ์ ์ฝ์๊ณ , ๊ทธ๊ฒ์ ํ์๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒฐ๋ก ์ผ๋ก โโ๊ท๊ฒฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ์ ๋๊ตฌ ์์ฑ์์๊ฒ๋ ์๋์ ์ผ๋ก ์ ์ ์์ ๊ณ ํต์ด ๋์ง ์์ต๋๊น? ๋ฐ๋ฉด์ ์ถ๊ฐ ๊ดํธ์ this-look-like-a-function- but-is-in-in-readability ๋ฌธ์ ๋ ๋ชจ๋ Go ์ฝ๋์ ์ฝ๋์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์
๋๋ค. ๋
์๋ ๊ฒฌ๋์ผ ํ๋ค. ๋ด ์๊ฒฌ์ผ๋ก๋ (๋ณ๋ช
? :-) "ํ์ง๋ง panic()
๋ ํ๋ฆ์ ์ ์ดํฉ๋๋ค"๋ ๊ทธ๊ฒ์ ์๋ฅด์ง ์์ต๋๋ค. ์๋ํ๋ฉด ํจ๋๊ณผ ํ๋ณต์ ๋ณธ์ง์ ์ผ๋ก ์์ธ์ ์ธ ๋ฐ๋ฉด try()
๋ ์ ์์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ ์ด ํ๋ฆ์ด์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ๊ทธ๋๋ก ๋ค์ด๊ฐ๋๋ผ๋ ๋๋ ํ์คํ ๊ฐ์ฌํ ๊ฒ์ด์ง๋ง, ๋ด๊ฐ ๊ฐ์ฅ ์ ํธํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ์ด ๋ช ํํด์ง๋ ๊ฒ, ์ฆ ํค์๋๋ฅผ ํตํด ์ํ๋๋ ๊ฒ์ ๋๋ค.
์ ๋ ์ด ์ ์์ ์ฐฌ์ฑํฉ๋๋ค. ์ด์ ์ ์์ ๋ํ ๊ฐ์ฅ ํฐ ์์ฝ์ ํผํฉ๋๋ค: defer
์ ๋ํ handle
์ ๋น์ง๊ต์ฑ.
์์์ ๊ฐ์กฐ๋์ง ์์ ๋ ๊ฐ์ง ์ธก๋ฉด์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค.
์ฒซ์งธ, ์ด ์ ์์ด ์ค๋ฅ์ ์ํฉ๋ณ ์ค๋ฅ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ๊ฒ ๋ง๋ค์ง๋ ์์ง๋ง ์คํ ํ๋ ์ ์ค๋ฅ ์ถ์ ์ ๋ณด๋ฅผ ์ค๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ํฉ๋๋ค. https://play.golang.org/p /YL1MoqR08E6
๋์งธ, try
๋ ํ๋ฆผ์์ด https://github.com/golang/go/issues/19642์ ๊ธฐ๋ณธ ๋ฌธ์ ๋๋ถ๋ถ์ ๋ํ ๊ณต์ ํ ์๋ฃจ์
์
๋๋ค. ํด๋น ๋ฌธ์ ์ ์๋ฅผ ๋ค๋ฉด try
๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๋ฒ ๋ชจ๋ ๋ฐํ ๊ฐ์ ์์ฑํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๊ธด ์ด๋ฆ์ ๊ฐ์ง ๊ฐ์ ์ํ ๊ตฌ์กฐ์ฒด ์ ํ์ ๋ฐํํ ๋ ์ ์ฌ์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
xx := int(x)
if f.NumGlyphs() <= xx {
try(ErrNotFound)
}
i := f.cached.locations[xx+0]
j := f.cached.locations[xx+1]
if j < i {
try(errInvalidGlyphDataLength)
}
if j-i > maxGlyphDataLength {
try(errUnsupportedGlyphDataLength)
}
buf, err = b.view(&f.src, int(i), int(j-i))
return buf, i, j - i, err
}
์ด ์ ์๋ ๋ง์์ ๋ญ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ถํ์ด ์์ต๋๋ค.
make
try
๊ฐ ๋ค์ํ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉํ ์ ์์ต๋๊น?
์ด๋ฐ ์์ผ๋ก ๋ช ์์ ์ด๋ฉด์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํ๋์ ๋ด์ฅ ๊ธฐ๋ฅ์ ๋๋ค. ์ฅ์ :
๋ฐ๋ณต์ ์ธ if err !=nil { return ... err }
๋ ํ์คํ ๋ชป์๊ธด ๋ง๋๋ฌ์ด์ง๋ง ๋๋ ๊ทธ ๋ง์ ๋์ํฉ๋๋ค.
try() ์ ์์ด ๊ฐ๋
์ฑ์ด ๋งค์ฐ ๋ฎ๊ณ ๋ค์ ๋ถ๋ถ๋ช
ํ๋ค๊ณ ์๊ฐํ๋ ์ฌ๋.
๋ช
๋ช
๋ ๋ฐํ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์ด๋ฐ ์ข
๋ฅ์ ์ ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ ์คํ์ผ๋ก try(err)
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
if err !=nil { return err }
:
file, err := os.Open("file.go")
try(err)
~์์ํ
file, err := os.Open("file.go")
if err != nil {
return err
}
๋ฐํ ๊ฐ์ด ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ try(err)
๋ return t1, ... tn, err
์ ์์ต๋๋ค.
์ฌ๊ธฐ์ t1, ... tn์ ๋ค๋ฅธ ๋ฐํ ๊ฐ์ 0 ๊ฐ์
๋๋ค.
์ด ์ ์์ ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์ ํ์์ฑ์ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ,
์ ์๊ฐ์๋ ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
๋ ๋์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
file, try(err) := os.Open("file.go")
๋๋
file, err? := os.Open("file.go")
์ด ๋ง์ง๋ง ํญ๋ชฉ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค(ํ์ฌ ์๋ณ์์๋ ?๊ฐ ํ์ฉ๋์ง ์์).
(์ด ์ ์์ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring-themes ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ณต๋๋ ํ ๋ง ์์ ๋ ๋ ๋์ง ์๊ณ ๋ช ์์ ํธ๋ค์ด ์ฌ์ ํ ๋ ผ์๋๋ ๋จ๊ณ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅด๊ฒ ๋ณด์ ๋๋ค. ์ฐ๊ธฐํ๋ ๊ฒ์ ๋๋ค.)
์ด ์ ์คํ๊ณ ํฅ๋ฏธ๋ก์ด ์ ์์ ํด์ฃผ์ go ํ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@rogpeppe comment if try
๋ด๊ฐ ์๋ ์คํ ํ๋ ์์ ์๋์ผ๋ก ์ถ๊ฐํ๋ฉด ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
@aarzilli - ๊ทํ์ ์ ์์ ๋ฐ๋ฅด๋ฉด tryf
์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ ๋๋ง๋ค defer ์ ์ด ํ์์
๋๊น?
๋ด๊ฐ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น
try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
์ง์ฐ ๊ธฐ๋ฅ์ ์์ฑํ์ง ์์ต๋๊น?
@agnivade
๋ด๊ฐ ํ๊ณ (...) defer ํจ์๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์ ํ ๊ฒ์ฌ ์ค๋ฅ.
์ ์๊ฐ์๋ ๋ชจ๋ ๋ฐํ ๊ฐ์ ์ฐ์ง ์๊ธฐ ์ํด try
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ ๋ก ๊ทธ๊ฒ์ ๋ํ ๋ ๋ค๋ฅธ ๊ณต๊ฒฉ์
๋๋ค.
func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
xx := int(x)
if f.NumGlyphs() <= xx {
try(ErrNotFound)
}
//...
return nil, 0, 0, ErrNotFound
๋ฅผ ์์ฑํ์ง ์์ผ๋ ค๋ ์๊ตฌ๋ฅผ ์์ ํ ์ดํดํ์ง๋ง ์ฐจ๋ผ๋ฆฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค.
try
๋ผ๋ ๋จ์ด๋ "๋์๊ฐ๋ค"๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ฌ๊ธฐ์์ ์ฌ์ฉ๋๋ ๋ฐฉ์์
๋๋ค. ๋๋ ์ค์ ๋ก try
๊ฐ error
๊ฐ์ ์ง์ ๋ฐ์ ์ ์๋๋ก ์ ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ๊ฒ์ ์๋ชป ์ฝ์ต๋๋ค. ๊ทธ ์ฝ๋๋ฅผ ์ด๋ณด์์๊ฒ ๋ณด์ฌ์ฃผ๋ฉด ๊ทธ๋ค์ ๊ทธ ์๋๊ฐ ๋ฌด์์ ํ๊ณ ์๋์ง ์ ํ ๋ชฐ๋์ ๊ฒ์
๋๋ค.
๊ธฐ๋ณธ๊ฐ๊ณผ ์ค๋ฅ ๊ฐ์ ์ฝ๊ฒ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ์ํ๋ฉด ๋ณ๋๋ก ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ฉ๋ฉด ๋ค๋ฅธ ๋ด์ฅ ๊ฐ์
return default(ErrNotFound)
์ ์ด๋ ๊ทธ๊ฒ์ ์ด๋ค ์ข ๋ฅ์ ๋ ผ๋ฆฌ๋ก ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ try
๋ฅผ ๋จ์ฉํ์ฌ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ง์๋ค.
@natefinch try
๋ด์ฅ์ ์ด๋ฆ์ด ์๋ ์ ์์์์ ๊ฐ์ด check
์ด๋ฉด check(err)
๊ฐ ๋์ด ํจ์ฌ ๋ ์ ์ฝํ๋๋ค.
๊ทธ๊ฑด ์ ์ณ๋๊ณ , try(err)
์ฐ๋ ๊ฒ์ด ์ ๋ง ๋จ์ฉ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊น๋ํ๊ฒ ์ ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์ด๊ฒ์ด ํฉ๋ฒ์ ์ด๋ผ๋ ์๋ฏธ์ด๊ธฐ๋ ํฉ๋๋ค.
a, b := try(1, f(), err)
try
์ ๋ํ ๋ด ์ฃผ์ ๋ฌธ์ ๋ ์ค์ ๋ก ํ ๋จ๊ณ๋ง ์ฌ๋ผ๊ฐ๋ panic
๋ผ๋ ๊ฒ์
๋๋ค. ๋จ, ํจ๋๊ณผ ๋ฌ๋ฆฌ ๋ฌธ์ด ์๋๋ผ ํํ์ด๋ฏ๋ก ์จ๊ธธ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋๊ฐ์ ์ง์ ์ ์ค๊ฐ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฑฐ์ ๊ณตํฉ ์ํ๋ณด๋ค ๋ ์
ํ ๋ฉ๋๋ค.
@natefinch ํ ๋จ๊ณ ์ฌ๋ผ๊ฐ์ ๋ค๋ฅธ ์ผ์ ํ๋ ํจ๋์ฒ๋ผ ๊ฐ๋
ํํ๋ฉด ๊ฝค ์ง์ ๋ถํด ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๋ค๋ฅด๊ฒ ๊ฐ๋
ํํ๋ค. Go์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์๋ ๊ฒฐ๊ณผ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐํํฉ๋๋ค.try
๋ ๊ฒฐ๊ณผ์ ์์ถ์ ํ๊ณ error != nil
์ด๋ฉด "์ค๋ฅ ๊ฒฐ๊ณผ"๋ฅผ ๋ฐํํ๊ฑฐ๋ error == nil
์ด๋ฉด ๊ฒฐ๊ณผ์ T ๋ถ๋ถ ์์ถ์ ํธ๋ ์ ํธ๋ฆฌํฐ์
๋๋ค.
๋ฌผ๋ก Go์๋ ์ค์ ๋ก ๊ฒฐ๊ณผ ๊ฐ์ฒด๊ฐ ์์ง๋ง ์ฌ์ค์ ๋์ผํ ํจํด์ด๊ณ try
๋ ํด๋น ํจํด์ ์์ฐ์ค๋ฌ์ด ์ฝ๋ํ์ฒ๋ผ ๋ณด์
๋๋ค. ๋๋ ์ด ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ํด๊ฒฐ์ฑ
์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ผ๋ถ ์ธก๋ฉด์ ์ฑ๋ฌธํํด์ผ ํ๊ณ try
๊ฐ ์ด๋ฅผ ๋ฐ์๋ค์ด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ธฐ์กด Go ์ค๋ฅ ์ฒ๋ฆฌ ํจํด์ ๋ ์ ๋ง๋๋ก try
์ ๊ธฐ๋ฅ์ ์ฝ๊ฐ ํ์ฅํ ๊ฒ์ ์ ์ํ์ง๋ง ๊ธฐ๋ณธ ๊ฐ๋
์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
@ugorji ๋น์ ์ด ์ ์ํ try(f, bool)
๋ณ์ข
์ #32219์ must
์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@ugorji ๋น์ ์ด ์ ์ํ
try(f, bool)
๋ณ์ข ์ #32219์must
์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์, ๊ทธ๋ ์ต๋๋ค. 3๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ ๋จ์ผ ๋ด์ฅ ํจ์๋ก ์ฒ๋ฆฌํ ์ ์๊ณ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐ์ํ๊ฒ ๋ง์กฑ์ํฌ ์ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
try()
๋ ์ด๋ฏธ ๋ง์ ์ ์ด๊ณ ์ค๋ฅ ๋ฐํ ๊ฐ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ nullary(์ธ์ ์์) ํ์์ผ๋ก ํธ์ถ๋ ๋ ํด๋น ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ ๋ฐํํ๋๋ก ํ์ฅ๋ ์ ์์ต๋๊น? ๊ทธ๋ฌ๋ฉด ๋ช
๋ช
๋ ๋ฐํ์ด ํ์ํ์ง ์์ผ๋ฉฐ defer ๋ฌธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ์์๋๋ ์์น๋ฅผ ์๊ฐ์ ์ผ๋ก ์ฐ๊ด์ํค๋ ๋ฐ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
func foo() error {
defer fmt.HandleErrorf(try(), "important foo context info")
try(bar())
try(baz())
try(etc())
}
@ugorji
try(f, bool)
์ ๋ถ์ธ์ ์ง์ ํ๋ฉด ์ฝ๊ธฐ ์ด๋ ต๊ณ ๋์น๊ธฐ ์ฝ์ต๋๋ค. ๋๋ ๋น์ ์ ์ ์์ ์ข์ํ์ง๋ง ํจ๋์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ธ ๋ฒ์งธ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ(์: try(f(), func(err error) { panic('at the disco'); })
)์์ ํธ๋ค๋ฌ ๋ด๋ถ์ ์์ฑํ๋ ๊ฒ์ ์๋ตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์จ๊ฒจ์ง try(f(), true)
๋ณด๋ค ์ฌ์ฉ์์๊ฒ ๋ ๋ช
ํํด์ง๋๋ค.
@ugorji
try(f, bool)
์ ๋ถ์ธ์ ์ง์ ํ๋ฉด ์ฝ๊ธฐ ์ด๋ ต๊ณ ๋์น๊ธฐ ์ฝ์ต๋๋ค. ๋๋ ๋น์ ์ ์ ์์ ์ข์ํ์ง๋ง ํจ๋์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ธ ๋ฒ์งธ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ(์:try(f(), func(err error) { panic('at the disco'); })
)์์ ํธ๋ค๋ฌ ๋ด๋ถ์ ์์ฑํ๋ ๊ฒ์ ์๋ตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์จ๊ฒจ์งtry(f(), true)
๋ณด๋ค ์ฌ์ฉ์์๊ฒ ๋ ๋ช ํํด์ง๋๋ค.
๋ ์๊ฐํด๋ณด๋ฉด, ๋๋ ๋น์ ์ ์ ์ฅ๊ณผ ๋น์ ์ ์ถ๋ก ์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฉฐ, ์ฌ์ ํ ํ ์ค์ง๋ฆฌ๋ก ์ฐ์ํด ๋ณด์ ๋๋ค.
@patrick-nyt๋ https://github.com/golang/go/issues/32437#issuecomment -499533464์์ nil ํ ์คํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ _assignment syntax_์ ๋ ๋ค๋ฅธ ์ง์ง์์ ๋๋ค.
์ด ๊ฐ๋
์ ํ์ธ/์ฒ๋ฆฌ ์ ์์ ๋ํ 13๊ฐ์ ๊ฐ๋ณ ์๋ต์ ๋ํ๋ฉ๋๋ค.
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes
f, ?return := os.Open(...)
f, ?panic := os.Open(...)
์์? Go 1์ฒ๋ผ ์ฝ์ง๋ง try()
๋ฐ check
๋ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
try
์ ๋ํ ํ ๊ฐ์ง ์ด์๋ ๊ทธ๊ฒ์ด ํํ์ด๋ผ๋ ๊ฒ์
๋๋ค. ๋์ ์ nil์ด ์๋๋ฉด ๋ฐํ์ ์๋ฏธํ๋ ๋จํญ ์ ๋ฏธ์ฌ ๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค ?
๋ค์์ ํ์ค ์ฝ๋ ์ํ์
๋๋ค( ์ ์๋ ์ง์ฐ ํจํค์ง ๊ฐ ์ถ๊ฐ๋์๋ค๊ณ ๊ฐ์ ).
func CopyFile(src, dst string) error {
var err error // Don't need a named return because err is explicitly named
defer deferred.Annotate(&err, "copy %s %s", src, dst)
r, err := os.Open(src)
err?
defer deferred.AnnotatedExec(&err, r.Close)
w, err := os.Create(dst)
err?
defer deferred.AnnotatedExec(&err, r.Close)
defer deferred.Cond(&err, func(){ os.Remove(dst) })
_, err = io.Copy(w, r)
return err
}
pgStore ์:
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
err?
defer deferred.Cond(&err, func(){ tx.Rollback() })
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
// tricky bit: this would not change the value of err
// but the deferred.Cond would still be triggered by err being set before
deferred.Format(err, "insert table")?
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
deferred.Format(err, "insert table2")?
return tx.Commit()
}
๋๋ @jargv์์ ์ด๊ฒ์ ์ข์ํฉ๋๋ค :
try()๋ ์ด๋ฏธ ๋ง์ ์ ์ด๊ณ ์ค๋ฅ ๋ฐํ ๊ฐ์ ์๊ณ ์์ผ๋ฏ๋ก nullary(์ธ์ 0) ํ์์ผ๋ก ํธ์ถ๋ ๋ ํด๋น ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ ๋ฐํํ๋๋ก ํ์ฅ๋ ์ ์์ต๋๊น? ๊ทธ๋ฌ๋ฉด ๋ช ๋ช ๋ ๋ฐํ์ด ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ธ์์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก try
๋ผ๋ ์ด๋ฆ์ ์ค๋ฒ๋ก๋ํ๋ ๋์ $ reterr
๊ฐ์ ๋ ๋ค๋ฅธ ๋ง๋ฒ ๋ด์ฅ์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์์ฃผ ์ฌ์ฉ๋๋ ํจํค์ง์ ๋ํด ๋ธ๋ฆฌํ์ ํ๋ฉฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ก "๊ณ ํต์ ๋ฐ๋" go ์ฝ๋๋ฅผ ์ฐพ์์ง๋ง ์ ์๋ try()๊ฐ ์ํํ "๋ง๋ฒ"์ด ๋ฌด์์ธ์ง ์์๋ด๋ ค ํ์ต๋๋ค.
ํ์ฌ, ๋ด๊ฐ ์ ์์ ์๋ชป ์ดํดํ์ง ์๋ ํ, ๊ทธ ์ค ๋ง์ ๊ฒ(์: ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋)์ ๋ง์ ๊ฒ์ ์ป์ง ๋ชปํ๊ฑฐ๋ "์ค๋๋" ์ค๋ฅ ์ฒ๋ฆฌ ์คํ์ผ์ ์ ์งํด์ผ ํฉ๋๋ค.
net/http/request.go์ ์:
func (r *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, waitForContinue func() bool) (err error) {
`
trace := httptrace.ContextClientTrace(r.Context())
if trace != nil && trace.WroteRequest != nil {
defer func() {
trace.WroteRequest(httptrace.WroteRequestInfo{
Err: err,
})
}()
}
// Find the target host. Prefer the Host: header, but if that
// is not given, use the host from the request URL.
//
// Clean the host, in case it arrives with unexpected stuff in it.
host := cleanHost(r.Host)
if host == "" {
if r.URL == nil {
return errMissingHost
}
host = cleanHost(r.URL.Host)
}
// According to RFC 6874, an HTTP client, proxy, or other
// intermediary must remove any IPv6 zone identifier attached
// to an outgoing URI.
host = removeZone(host)
ruri := r.URL.RequestURI()
if usingProxy && r.URL.Scheme != "" && r.URL.Opaque == "" {
ruri = r.URL.Scheme + "://" + host + ruri
} else if r.Method == "CONNECT" && r.URL.Path == "" {
// CONNECT requests normally give just the host and port, not a full URL.
ruri = host
if r.URL.Opaque != "" {
ruri = r.URL.Opaque
}
}
if stringContainsCTLByte(ruri) {
return errors.New("net/http: can't write control character in Request.URL")
}
// TODO: validate r.Method too? At least it's less likely to
// come from an attacker (more likely to be a constant in
// code).
// Wrap the writer in a bufio Writer if it's not already buffered.
// Don't always call NewWriter, as that forces a bytes.Buffer
// and other small bufio Writers to have a minimum 4k buffer
// size.
var bw *bufio.Writer
if _, ok := w.(io.ByteWriter); !ok {
bw = bufio.NewWriter(w)
w = bw
}
_, err = fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(r.Method, "GET"), ruri)
if err != nil {
return err
}
// Header lines
_, err = fmt.Fprintf(w, "Host: %s\r\n", host)
if err != nil {
return err
}
if trace != nil && trace.WroteHeaderField != nil {
trace.WroteHeaderField("Host", []string{host})
}
// Use the defaultUserAgent unless the Header contains one, which
// may be blank to not send the header.
userAgent := defaultUserAgent
if r.Header.has("User-Agent") {
userAgent = r.Header.Get("User-Agent")
}
if userAgent != "" {
_, err = fmt.Fprintf(w, "User-Agent: %s\r\n", userAgent)
if err != nil {
return err
}
if trace != nil && trace.WroteHeaderField != nil {
trace.WroteHeaderField("User-Agent", []string{userAgent})
}
}
// Process Body,ContentLength,Close,Trailer
tw, err := newTransferWriter(r)
if err != nil {
return err
}
err = tw.writeHeader(w, trace)
if err != nil {
return err
}
err = r.Header.writeSubset(w, reqWriteExcludeHeader, trace)
if err != nil {
return err
}
if extraHeaders != nil {
err = extraHeaders.write(w, trace)
if err != nil {
return err
}
}
_, err = io.WriteString(w, "\r\n")
if err != nil {
return err
}
if trace != nil && trace.WroteHeaders != nil {
trace.WroteHeaders()
}
// Flush and wait for 100-continue if expected.
if waitForContinue != nil {
if bw, ok := w.(*bufio.Writer); ok {
err = bw.Flush()
if err != nil {
return err
}
}
if trace != nil && trace.Wait100Continue != nil {
trace.Wait100Continue()
}
if !waitForContinue() {
r.closeBody()
return nil
}
}
if bw, ok := w.(*bufio.Writer); ok && tw.FlushHeaders {
if err := bw.Flush(); err != nil {
return err
}
}
// Write body and trailer
err = tw.writeBody(w)
if err != nil {
if tw.bodyReadError == err {
err = requestBodyReadError{err}
}
return err
}
if bw != nil {
return bw.Flush()
}
return nil
}
`
๋๋ pprof/profile/profile_test.go์ ๊ฐ์ ์ฒ ์ ํ ํ
์คํธ์์ ์ฌ์ฉ๋ ๊ฒ์ฒ๋ผ:
`
func checkAggregation(prof *ํ๋กํ, *aggTest) ์ค๋ฅ {
// ํ์ ๋ํ ์ด ์ํ ์๊ฐ ๋ณด์กด๋์๋์ง ํ์ธํฉ๋๋ค.
์ด๊ณ := int64(0)
samples := make(map[string]bool)
for _, sample := range prof.Sample {
tb := locationHash(sample)
samples[tb] = true
total += sample.Value[0]
}
if total != totalSamples {
return fmt.Errorf("sample total %d, want %d", total, totalSamples)
}
// Check the number of unique sample locations
if a.rows != len(samples) {
return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows)
}
// Check that all mappings have the right detail flags.
for _, m := range prof.Mapping {
if m.HasFunctions != a.function {
return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function)
}
if m.HasFilenames != a.fileline {
return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline)
}
if m.HasLineNumbers != a.fileline {
return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline)
}
if m.HasInlineFrames != a.inlineFrame {
return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame)
}
}
// Check that aggregation has removed finer resolution data.
for _, l := range prof.Location {
if !a.inlineFrame && len(l.Line) > 1 {
return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID)
}
for _, ln := range l.Line {
if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) {
return fmt.Errorf("found line %s:%d on location %d, want :0",
ln.Function.Filename, ln.Line, l.ID)
}
if !a.function && (ln.Function.Name != "") {
return fmt.Errorf(`found file %s location %d, want ""`,
ln.Function.Name, l.ID)
}
}
}
return nil
}
`
๋ค์์ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๋ ๊ฐ์ง ์์
๋๋ค. "๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ์ต์
์ ์ํฉ๋๋ค"
๋๊ตฐ๊ฐ try() ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ์ ๋๋์ง ๋ณด์ฌ์ค ์ ์์ต๋๊น?
์ ๋ ์ด ์ ์์ ๋๋ถ๋ถ ์ฐฌ์ฑํฉ๋๋ค.
๋ง์ ์ฃผ์๊ฐ๋ค๊ณผ ๊ณต์ ํ๋ ๋์ ์ฃผ์ ๊ด์ฌ์ฌ๋ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ๊ดํ ๊ฒ์ ๋๋ค. ํ์ฌ ์ ์์ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ํจ์ฌ ๋ ๋ง์ด ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ฉฐ ์ด๋ ์ค์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ ์์์ ๋ช ์๋ ๊ฒ์ฒ๋ผ ๋จ์ํ ์คํ์ผ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ช ๋ช ๋ ๊ฒฐ๊ณผ๋ ๋ง์ ๊ฒฝ์ฐ์ ์ฝ๋๋ฅผ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ฑฐ๋ ๋ ๋ช ํํ๊ฒ ๋ง๋๋ ์ธ์ด์ ๋ฏธ๋ฌํ ๊ธฐ๋ฅ์ ๋๋ค. Go ์ฝ๋๋ฅผ ์ฝ๊ณ ์์ฑํ ์ง ์ฝ 8๋ ํ, ์ ๋ ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก๋ง ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ง์ ์ฌ์ฉํฉ๋๋ค.
error
)์๋ก์ด ๋ฐฉํฅ์์ ์ด ๋ฌธ์ ๋ฅผ ๊ณต๊ฒฉํ๊ธฐ ์ํด ๋์์ธ ๋ฌธ์ ๋๋ ์ด ๋ฌธ์ ์ฃผ์ ์ค๋ ๋์์ ๋ ผ์๋ ๊ฒ๊ณผ ๋ฐ์ ํ๊ฒ ์ผ์นํ์ง ์๋๋ค๊ณ ์๊ฐํ๋ ์์ด๋์ด๊ฐ ์์ต๋๋ค. "์ค๋ฅ ์ง์ฐ"์ด๋ผ๊ณ ํฉ์๋ค.
์์์ ์ค๋ฅ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐ defer๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ
func f(err error, t1 T1, t2 T2, ..., tn Tn) error
๊ทธ๋ฐ ๋ค์ ๋ง์ง๋ง ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ error
์ ํ์ธ $#$2 g
#$ ํจ์(์ฆ, try
๊ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ํจ์)์์ $ f
์ ๋ํ ํธ์ถ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ธฐ๋ ์ ์์ต๋๋ค.
func g() (R0, R0, ..., error) {
defer f(t0, t1, ..., tn) // err is implicit
}
error-defer์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
f
์ ๋ํ ์ง์ฐ๋ ํธ์ถ์ f
์ ์ฒซ ๋ฒ์งธ ์
๋ ฅ ๋งค๊ฐ๋ณ์๋ก g
์ ๋ง์ง๋ง ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ก ํธ์ถ๋ฉ๋๋ค.f
๋ ํด๋น ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ์๋ง ํธ์ถ๋ฉ๋๋ค.f
์ ๊ฒฐ๊ณผ๋ g
์ ๋ง์ง๋ง ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ฉ๋๋ค.๋ฐ๋ผ์ error-defer ๋ฐ try๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์ค๋ฅ ์ฒ๋ฆฌ ์ค๊ณ ๋ฌธ์์ ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
func printSum(a, b string) error {
defer func(err error) error {
return fmt.Errorf("printSum(%q + %q): %v", a, b, err)
}()
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x+y)
return nil
}
HandleErrorf๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func printSum(a, b string) error {
defer handleErrorf("printSum(%q + %q)", a, b)
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x+y)
return nil
}
func handleErrorf(err error, format string, args ...interface{}) error {
return fmt.Errorf(format+": %v", append(args, err)...)
}
ํด๊ฒฐํด์ผ ํ ํ ์ฝ๋ ์ผ์ด์ค๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ฐ๊ธฐ ํ์์ด ๋ชจํธํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์๋ช ์ด ์๋ (๋งค์ฐ ํน์ดํ) ๊ธฐ๋ฅ์์๋ง ๋ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
func(error, ...error) error
์ด ๊ฒฝ์ฐ๊ฐ ์ค๋ฅ๊ฐ ์๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค๊ณ ๋งํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค(์ด๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํฉ๋๋ค).
์ง๋ ๋ฉฐ์น ๋์ ์ด ์์ด๋์ด์ ๋ํด ์๊ฐํด๋ณด๋ฉด ์ฝ๊ฐ ๋ง๋ฒ ๊ฐ์ ์ผ์ด์ง๋ง ๋ช
๋ช
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ํฐ ์ด์ ์
๋๋ค. try
๋ ์ค๋ฅ ์กฐ์์ ์ํด defer
๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ฏ๋ก defer
๋ฅผ ํ์ฅํ์ฌ ํด๋น ๋ชฉ์ ์ ๋ ์ ํฉํ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค. ๋ํ try
์ error-defer ์ฌ์ด์๋ ์ผ์ ํ ๋์นญ์ด ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก error-defers๋ ์ค๋ฅ ๋ฐํ์ ์กฐ์ํ๊ธฐ ์ํด ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ฌ์ฉ์ ๋์ฒดํ๊ธฐ ๋๋ฌธ์ ์ค๋๋ ์๋ try ์์ด๋ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ์ค์ ์ฝ๋์ ํธ์ง๋ ๋ฒ์ ์ ๋๋ค.
// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) (_ []*File, err error) {
files := make([]*file, len(keys))
defer func() {
if err != nil {
// Return any successfully retrieved files.
for _, f := range files {
if f != nil {
c.put(f)
}
}
}
}()
// ...
}
error-defer๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) ([]*File, error) {
files := make([]*file, len(keys))
defer func(err error) error {
// Return any successfully retrieved files.
for _, f := range files {
if f != nil {
c.put(f)
}
}
return err
}()
// ...
}
@beoran ์ ๋ค๋ฆญ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๊ทํ์ ์๊ฒฌ ์ ๋ํด. ์ ๋ค๋ฆญ์ ์ฌ๊ธฐ์์ ๋์์ด ๋์ง ์์ต๋๋ค. FAQ ๋ฅผ ์ฝ์ผ์ญ์์ค.
@velovix ์ 2-argument try
์ ๊ธฐ๋ณธ ๋์์ ๋ํ ๊ทํ์ ์ ์๊ณผ ๊ด๋ จํ์ฌ: ์ ์ ๋งํ๋ฏ์ด ๋ถ๋ช
ํ ํฉ๋ฆฌ์ ์ธ ์ ํ์ด ๋ฌด์์ธ์ง์ ๋ํ ๊ทํ์ ์์ด๋์ด๋ ๋ค๋ฅธ ์ฌ๋์ ์
๋ชฝ์
๋๋ค.
๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋ try
๊ฐ ํ์ฌ ์ต์ try
๋ณด๋ค ๋ ๋์ ์์ด๋์ด๋ผ๋ ํญ๋์ ํฉ์๊ฐ ์ด๋ฃจ์ด์ง๋ฉด ์ด ํ ๋ก ์ ๊ณ์ํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ทธ ์์ ์์ ๊ทธ๋ฌํ ๋์์ธ์ ์ข์ ์ ์ ๋
ผ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค.
(๊ทธ ๋ฌธ์ ์ ๊ดํด์๋ ํธ๋ค๋ฌ๊ฐ ์๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์ ์ด๊ธฐ ์ ์ ์ค ํ๋์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ try
๋ฅผ ๊ทธ๋๋ก ์ฑํํ๋๋ผ๋ ์ฌ์ ํ ํธ๋ค๋ฌ๊ฐ ์๋ try
๋ก ์ด๋ํ ์ ์์ต๋๋ค. -compatible way - ์ ์ด๋ ํธ๋ค๋ฌ๊ฐ ์ ํ ์ฌํญ์ด๋ผ๋ฉด ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ๊ฐ์.)
@aarzilli ์ ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ฅ์ ์ค๋ฅ๊ฐ ์ ํ ์ฌํญ์ธ ํ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ํ์ง ์๋ ์ชฝ์ผ๋ก ๊ธฐ์ธ๊ฒ ๋ ๊ฒ์ ๋๋ค(๊ฒฐ๊ตญ ์ถ๊ฐ ์์ ์ ๋๋ค). ์ฌ๊ธฐ์์ ๋ด ์๊ฒฌ๋ ์ฐธ์กฐํ์ญ์์ค.
๊ทธ๋์, ๋๋ ์ ์๋ try
์ฌ๋๋ค์ด ์ฅ์ ์ค๋ฅ๋ฅผ _discourages_ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค(์์ ์ด์ ๋ก if
๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ด๋ฏธ ๋๋ดํ๊ณ ์์ต๋๋ค). try
๋ _์ฅ๋ คํ์ง_ ์์ต๋๋ค.
(์ด๋ฅผ ์ฅ๋ คํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ try
์ ๋ฌถ๋ ๊ฒ์
๋๋ค. ์ค๋ฅ๋ฅผ ์ฅ์ํ๊ฑฐ๋ ๋ช
์์ ์ผ๋ก ์ตํธ์์ํ๋ ๊ฒฝ์ฐ์๋ง try
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.)
๊ทธ๋ฌ๋ ๊ทํ์ ์ ์์ผ๋ก ๋์๊ฐ์: ๊ทํ๊ฐ ์ฌ๊ธฐ์ ํจ์ฌ ๋ ๋ง์ ๊ธฐ๊ณ๋ฅผ ๋์
ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. try
์ ๋ํด ๋ ์ ์๋ํ๋๋ก defer
์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ฌํ defer
๋ณ๊ฒฝ์ด ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ๋์์ด ๋์ง ์๋ ํ ๊ณ ๋ คํ๊ณ ์ถ์ง ์์ ์ฌํญ์
๋๋ค. ๋ํ ๊ทํ์ ์ ์์ defer
์ try
๋ฅผ ์ฐ๊ฒฐํ๋ฏ๋ก ๋ ๋ฉ์ปค๋์ฆ ๋ชจ๋ ์ง๊ต์ฑ์ด ๋จ์ด์ง๋๋ค. ์ฐ๋ฆฌ๊ฐ ํผํ๊ณ ์ถ์ ๊ฒ.
๊ทธ๋ฌ๋ ๋ ์ค์ํ ๊ฒ์ ๋ชจ๋ ์ฌ๋์ด try
๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก defer
์ ์ฐ๋๋ก ๊ฐ์ํ๊ณ ์ถ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ๋ค์ ์์ ์ผ๋ก ๋์๊ฐ๋๋ค. ์ฌ๋๋ค์ ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ์ง ์๋ ์ชฝ์ผ๋ก ๊ธฐ์ธ๊ฒ ๋ ๊ฒ์
๋๋ค.
(์ ๋ ๊ทธ ๋ฌธ์ ์ ๋ํด ํธ๋ค๋ฌ๊ฐ ์๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์ ์ด์ ์ ์ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ try ๊ทธ๋๋ก๋ฅผ ์ฑํํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์์ผ๋ก ํธํ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ try๋ก ์ด๋ํ ์ ์์ต๋๋ค. ์ ์ด๋ ํธ๋ค๋ฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ ํ์ฌํญ์ ๋๋ค. ํ์ง๋ง ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ์ด๋ํด ๋ณด๊ฒ ์ต๋๋ค.)
๋ฌผ๋ก , ์๋ง๋ ๋ค๋จ๊ณ ์ ๊ทผ ๋ฐฉ์์ด ๊ฐ ๊ธธ์ผ ๊ฒ์
๋๋ค. ํฅํ์ ์ ํ์ ์ฒ๋ฆฌ๊ธฐ ์ธ์๋ฅผ ์ถ๊ฐํ๋ฉด errcheck
๋๊ตฌ์ ๋์ผํ ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ try
์์ฑ์์๊ฒ ๊ฒฝ๊ณ ํ๋ ๋๊ตฌ๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทํ์ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@alanfo ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋น์ ์ด ์ ๊ธฐํ ์์ ์ ๊ดํ์ฌ:
1) try
defer
๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ์ฅ์ํ ์ ์๋๋ก ์ค๋ฅ ๋ฐํ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค๋ ์ฌ์ค์ด๋ผ๋ฉด ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ด ์ค์ ๋ฌธ์ ๋ก ํ๋ช
๋๋ฉด ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ ์ค๋ฅ ๊ฒฐ๊ณผ์ ๋ํ ๋ณ์นญ์ธ ๋ฏธ๋ฆฌ ์ ์ธ๋ ๋ณ์์
๋๋ค(๊ฐ์ฅ ์ต๊ทผ์ try
๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ค๋ฅ๋ฅผ ๋ณด์ ํ๋ ๊ฒ์ผ๋ก ์๊ฐํ์ญ์์ค). ๋ ์ข์ ์์ด๋์ด๊ฐ ์์ ์ ์์ต๋๋ค. ์ธ์ด์ ๊ฒฐ๊ณผ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฉ์ปค๋์ฆ์ด ์ด๋ฏธ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ์ํ์ง ์์์ต๋๋ค.
2) try
๋ฐ ํ
์คํธ: ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์์ธํ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
3) ์ด๊ฒ์ ์์ธํ ๋ฌธ์์์ ๋ช
์์ ์ผ๋ก ๋ค๋ฃจ์ด์ง๋ค.
4) ์ธ์ ํฉ๋๋ค.
@benhoyt ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ์ ์์ ๋ฐ๋ํ๋ ์ฃผ์ ์ฃผ์ฅ์ด try
๊ฐ ๋ด์ฅ๋์ด ์๋ค๋ ์ฌ์ค์ด๋ผ๋ฉด ์ฐ๋ฆฌ๋ ์ข์ ์์น์ ์์ต๋๋ค. ๋ด์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ์ ๋ํ ์ค์ฉ์ ์ธ ์๋ฃจ์
์ผ ๋ฟ์
๋๋ค(ํ์ ๋ฐ ๋๊ตฌ ๋ฑ์ ๋ํ ์ถ๊ฐ ์์
์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ฃผ์ ์ด์ ๊ฐ ์๋๋ผ ์ข์ ๋ถ์์ ์ด์ ์ผ ๋ฟ์
๋๋ค). ๋ํ ๊ดํธ๋ฅผ ์์ฑํด์ผ ํ๋ ๋ช ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค. ์ด๋ ์ค๊ณ ๋ฌธ์(์ ์๋ ์ค๊ณ์ ์์ฑ ์น์
)์์ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง ๋ด์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค๋ฉด try
ํค์๋๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ํค์๋๊ฐ ๊ธฐ์กด ์๋ณ์์ ์ถฉ๋ํ ์ ์์ผ๋ฏ๋ก ๊ธฐ์กด ์ฝ๋์ ์ญํธํ๋์ง ์์ต๋๋ค.
(์์ ํ, ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ?
์ ๊ฐ์ ์ฐ์ฐ์ ์ต์
๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Go์ ๊ฐ์ ์ธ์ด์ ๋ํ ์ต์ ์ ์ ํ์ ์๋๋๋ค. ํ์ง๋ง ๋ค์, ๊ทธ๊ฒ์ด try
๋ฅผ ๋ง์๊ฒ ๋ง๋๋ ๋ฐ ํ์ํ ์ ๋ถ๋ผ๋ฉด ์ฐ๋ฆฌ๋ ์๋ง๋ ๊ทธ๊ฒ์ ๊ณ ๋ คํด์ผ ํ ๊ฒ์
๋๋ค.)
@ugorji ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
try
๋ ์ถ๊ฐ ์ธ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฅ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํธํ๋ ๊ฒ์ func (error) error
์๋ช
์ด ์๋ ํจ์๋ง ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๋นํฉํ๊ณ ์ถ๋ค๋ฉด ํ ์ค ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ฝ์ต๋๋ค.
func doPanic(err error) error { panic(err) }
try
์ ๋์์ธ์ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@patrick-nyt ๋น์ ์ด ์ ์ ํ๋ ๊ฒ :
file, err := os.Open("file.go")
try(err)
ํ์ฌ ์ ์์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค.
@dpinela , @ugorji must
vs try
์ฃผ์ ์ ๋ํ ๋์์ธ ๋ฌธ์๋ ์ฝ์ผ์ญ์์ค. try
๋ ์ต๋ํ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. must
๋ ์ด๊ธฐํ ํํ์์ ์ผ๋ฐ์ ์ธ "ํจํด"์ด์ง๋ง ์ด๋ฅผ "์์ "ํ ๊ธด๊ธํ ํ์๋ ์์ต๋๋ค.
@jargv ์ ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ ๋๋ค(์ด ์ฃผ์ ์ ๋ํ ๋ด ์๊ฒฌ๋ ์ฐธ์กฐ ํ์ญ์์ค ). ์์ฝ:
try(x)
๋ ์ ์๋ ๋๋ก ์๋ํฉ๋๋ค.try()
๋ ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋ฆฌํค๋ *error
$๋ฅผ ๋ฐํํฉ๋๋ค.์ด๊ฒ์ ์ค์ ๋ก ์ด๋ฆ์ ์ง์ ํ์ง ์๊ณ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ ๋๋ค.
@cespare @jargv ์ ์ ์ ์ ๋น์ ์ด ์ ์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํด ๋ณด์ ๋๋ค. ๊ฒฐ๊ณผ ์ค๋ฅ์ ๋ํ ๋์ผํ ์ก์ธ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ป๊ฒ ์๊ฐํด?
https://github.com/golang/go/issues/32437#issuecomment -499320588์ ๋ฐ๋ผ:
func doPanic(err ์ค๋ฅ) ์ค๋ฅ { ํจ๋(err) }
๋๋ ์ด ๊ธฐ๋ฅ์ด ๊ฝค ์ผ๋ฐ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์์ํ๋ค. ์ด๊ฒ์ "builtin"(๋๋ errors
๊ณผ ๊ฐ์ ํ์ค ํจํค์ง์ ๋ค๋ฅธ ๊ณณ)์์ ๋ฏธ๋ฆฌ ์ ์๋ ์ ์์ต๋๊น?
๊ตฌํํ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ๋ ฅํ ์ ๋ค๋ฆญ์ ๊ธฐ๋ํ์ง ์๋ ๊ฒ์ ๋๋ฌด ๋์ฉ๋๋ค.
์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋์ ๊ฒ์
๋๋ค.
์, ์ด ์ ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๊ฐ ๋ ์ ์์ต๋๋ค.
์ง๊ธ์ ๋ ์์ .
๋ฌผ๋ก , ์ด ๋ฌธ์ ๋ ์ธ๋ถ์ ์ธ ๋์์ ๋๋ฌด ๋ง์ ์ด์ ์ ๋ง์ถ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ง์ ์ฐธ๊ฐ์๋ค์ด ์์ ํ ๋ง์กฑํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ทธ๊ฒ. ์ด ์ ์์ ๋ํ ํญ๋์ ๊ณต๊ฐ๋๊ฐ ๋ถ์กฑํ ๊ฒ ๊ฐ์ต๋๋ค...
Op vr 7 jun. 2019 01:04 ์๋ฆฌํ ํผ์ ์ด ์๋ฆผ @github.com :
์์คํผ #32437 (๋๊ธ)
https://github.com/golang/go/issues/32437#issuecomment-499320588 :func doPanic(err ์ค๋ฅ) ์ค๋ฅ { ํจ๋(err) }
๋๋ ์ด ๊ธฐ๋ฅ์ด ๊ฝค ์ผ๋ฐ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์์ํ๋ค. ์ด๊ฒ์ ๋ฏธ๋ฆฌ ์ ์ ๋ ์ ์์ต๋๊น?
"๋นํธ์ธ"์์?โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAARM6OOOLLYO5ZCE6VVL2TPZGJWRA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LDNMVXH
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAARM6K5AOR2DES4QDTNLSTPZGJWRANCNFSM4HTGCZ7Q
.
@pjebs , ๋๋ฑํ ๊ธฐ๋ฅ์ ์์ญ ๋ฒ ์์ฑํ์ต๋๋ค. ๋๋ ๋ณดํต ๊ทธ๊ฒ์ "orDie" ๋๋ "check"๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋๋ฌด ๊ฐ๋จํ์ฌ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๋ก ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ข ๋ฃ ์ ์ ๋ก๊น ๋๋ ๋ฌด์์ด๋ ์ํ ์ ์์ต๋๋ค.
@beoran ์๋ง๋ ์ ๋ค๋ฆญ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ ๊ฐ์ ์ฐ๊ฒฐ์ ํ์ฅํ ์ ์์ต๋๋ค. ์๊ฐํด๋ณด๋ฉด ๋์ ๋ค๋ฅธ ๊ฒ ๊ฐ์์. ์ ๋ค๋ฆญ์ ์ธ์ด์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์บ์น ์ฌ์ด ์๋๋๋ค. ์ฌ๋ฌ ์ ํ์์ ์๋ํ ์ ์๋ ๋จ์ผ ํจ์๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ด ํน์ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ ์ผ๋ถ ์ํฉ์์ ํ๋ฆ ์ ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฏธ๋ฆฌ ์ ์ธ๋ ํจ์ try
๋ฅผ ๋์
ํ์ฌ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ค๊ณ ํฉ๋๋ค. ์ ๋ค๋ฆญ์ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๊ด๊ณ๊ฐ ์ ๋ง ์ ๋ณด์ธ๋ค.
ํจ์ ๋ด์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ฌ๋ฌ ํธ์ถ์ ์ฒ๋ฆฌํ๋ฉด defer
์ค๋ฅ ํธ๋ค์ด ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๋์ ์ด๊ธฐ ๋ฐ์์ ๐์์ต๋๋ค. ์ ์ฒด ์ ์์๋ฅผ ์ฝ์ ํ ์๋์ ์ผ๋ก ๋ฎ์ ๋ณต์ก์ฑ์ผ๋ก ์ฌ์ ํ ๋ฌ์ฑ ํ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ ๊ธฐ ๋๋ฌธ์ โค๏ธ ๋ฐ ๐์ ๋ํ ๋ฐ์์ ๋ค์ง์์ต๋๋ค.
@carlmjohnson ๋ค ๊ฐ๋จํ์ง๋ง...
๋๋ ๋๋ฑํ ๊ธฐ๋ฅ์ ์์ญ ๋ฒ ์์ฑํ์ต๋๋ค.
๋ฏธ๋ฆฌ ์ ์ธ๋ ํจ์์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@griesemer ์๋ try ์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ๋ณํ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ํ ๊ฐ์ฅ ์ค์ํ ํจ์์ ์๊ตฌ ์ฌํญ์ด ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ฒ์์ ๊ทธ๊ฒ์ ๋ํด ๋ฌผ์์ ๋ err => ๊ณตํฉ, ๋๋ ๊ทธ ์ ์์ด ๊ทธ๊ฒ์ ๊ณ ๋ คํ์ง๋ง ๊ทธ๊ฒ์ด ๋๋ฌด ์ํํ๋ค๊ณ (ํฉ๋นํ ์ด์ ๋ก) ๊ณ ๋ ค๋๋ค๋ ์ง์ ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฅ ์ค์ํ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ์๋๋ฆฌ์ค์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ์์ด try()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๋ก ๋ง๋ค๋ฉด ์ ์์์ ๋
ผ์๋ ๋ฌธ์ ๊ฐ ์ํ๋ฉ๋๋ค.
@pjebs ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ํ ๊ฐ์ฅ ์ค์ํ ํจ์์ ์๊ตฌ ์ฌํญ์ ์๋ ๋์์ธ์์ ํ์ํ์ง ์์ ์ค๋ฅ ํธ๋ค๋ฌ๊ฐ ์ ๊ณต๋ _if_์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ try
์ ๋ ๋ค๋ฅธ ํฉ๋ณ์ฆ์ผ ๋ฟ์
๋๋ค. ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด _ํจ์ฌ_ ์ข์ต๋๋ค. ๋์ , ํญ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํจ๋์ด ๋ฐ์ํ๋ ๋ณ๋์ must
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ช
ํํ ๊ฒ์
๋๋ค(๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด try
์ ๊ฐ์ต๋๋ค). ๊ทธ๋ฌ๋ฉด ์ฝ๋์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ๋ช
ํํด์ง๋ฉฐ ์ปจํ
์คํธ๋ฅผ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ฌํ must
์ ์ฃผ์ ๋งค๋ ฅ์ ๋จ์ ํ
์คํธ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ํนํ testing
ํจํค์ง๊ฐ must
๋ก ์ธํ ํจ๋์ ๋ณต๊ตฌํ๊ณ ์ข์ ๋ฐฉ์์ผ๋ก ํ
์คํธ ์คํจ๋ก ๋ณด๊ณ ํ๋๋ก ์ ์ ํ๊ฒ ์กฐ์ ๋ ๊ฒฝ์ฐ. ๊ทธ๋ฌ๋ TestXxx(t *testing.T) error
ํ์์ ํ
์คํธ ๊ธฐ๋ฅ๋ ํ์ฉํ๋๋ก ํ
์คํธ ํจํค์ง๋ฅผ ์กฐ์ ํ ์ ์๋๋ฐ ์ ๋ ๋ค๋ฅธ ์๋ก์ด ์ธ์ด ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํฉ๋๊น? ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งค์ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ด๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด(์๋ง๋ ์ฒ์๋ถํฐ ์ด ์์
์ ์ํํ์ด์ผ ํจ) try
๊ฐ ์ ๋๋ก ์๋ํฉ๋๋ค. ๋ก์ปฌ ํ
์คํธ๋ ์ฝ๊ฐ์ ์์
์ด ๋ ํ์ํ์ง๋ง ์๋ง๋ ๊ฐ๋ฅํฉ๋๋ค.
must
์ ๋ค๋ฅธ ๋น๊ต์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ ์ ์ญ ์ด๊ธฐํ ํํ์( must(regexp.Compile...
๋ฑ)์
๋๋ค. "์์ผ๋ฉด ์ข์" ๊ฒ์ด์ง๋ง ๊ทธ๊ฒ์ด ๋ฐ๋์ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ํ์ํ ์์ค๊น์ง ์ฌ๋ฆฌ๋ ๊ฒ์ ์๋๋๋ค.
@griesemer must
๊ฐ try
์ ๋ชจํธํ๊ฒ ๊ด๋ จ๋์ด ์๊ณ ์ถ์ง๋ ฅ์ด try
๊ตฌํ์ ํฅํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ must
์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น?
์ด๋ฒ ๋ผ์ด๋์์ ๋ ผ์๋์ง ์์ผ๋ฉด ์ต์ํ 3๋ ์ด์(๋๋ ์๋ง๋ ์์ผ๋ก๋) ๋์ ๊ตฌํ/์ฌ๊ฐํ๊ฒ ๊ณ ๋ ค๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๋ ผ์์ ์ค๋ณต๋ ์ฒ์๋ถํฐ ์์ํ๊ณ ๋ ผ์๋ฅผ ์ฌํ์ฉํ๋ ๊ฒ๋ณด๋ค ์ข์ ๊ฒ์ ๋๋ค.
๋ง์ ์ฌ๋๋ค์ด must
๊ฐ try
์์ฃผ ํ๋ฅญํ๊ฒ ์นญ์ฐฌํ๋ค๊ณ ๋งํ์ต๋๋ค.
@pjebs ํ์คํ ์ง๊ธ ๋น์ฅ์ " try
๊ตฌํ์ ๋ํ ๋ชจ๋ฉํ
"์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค... - ๊ทธ๋ฆฌ๊ณ ์ ํฌ๋ ์ด ๊ธ์ ์ดํ ์ ์ ์ฌ๋ ธ์ต๋๋ค. ๊ฒฐ์ ๋ ๊ฒ๋ ์์ต๋๋ค. ์๊ฐ์ ์ข ์ฃผ์.
must
๊ฐ try
์ ์ ์ด์ธ๋ฆฐ๋ค๋ ์ฌ์ค์ ์ฐ๋ฆฌ๋ฅผ ๋ฒ์ด๋์ง ๋ชปํ์ง๋ง, ์ด๋ ์ธ์ด์ ์ผ๋ถ๋ก ๋ง๋๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ
๋๋ค. ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ฌ๋๋ค๊ณผ ํจ๊ป ์ด ๊ณต๊ฐ์ ํํํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ์ง์ง ๋๋ ๋ฐ๋๊ฐ ๋ฌด์์ธ์ง ์์ง ๋ชปํฉ๋๋ค. ๊ฐ์ฌ ํด์.
๋ชจ๋ ์๊ฒฌ๊ณผ ์์ธํ ์ค๊ณ ๋ฌธ์๋ฅผ ์ฝ๋ ๋ฐ ๋ช ์๊ฐ์ ๋ณด๋ธ ํ ์ด ์ ์์ ๋ด ๊ฒฌํด๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค.
๋๋ @ianlancetaylor ์ ์ด์ ์์ ์ ๋ค์ ์ธ๊ธํ์ง ์๊ณ ๋์ ํ ๋ก ์ ์๋ก์ด ์๊ฒฌ์ ์ถ๊ฐํด ๋ฌ๋ผ๋ ์์ฒญ ์ ์กด์คํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด์ ์๊ฒฌ์ ์ด๋ ์ ๋ ์ฐธ์กฐํ์ง ์๊ณ ์๋ก์ด ์๊ฒฌ์ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
defer
์ ๋ช
๋ฐฑํ๊ณ ์ง์ ์ ์ธ ํน์ฑ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์ ํธํ๋ ๊ฒ์ ๋๋ผ์ด ์ผ์
๋๋ค. ๋ด๊ฐ defer closeFile(f)
๋ผ๊ณ ์ฐ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์ ๊ทธ๋ฐ์ง ๊ฐ๋จํ๊ณ ๋ถ๋ช
ํฉ๋๋ค. ํธ์ถ๋ ํจ์์ ๋์์. panic()
๋ฐ recover()
์ $ defer
#$๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ๋ช
ํํ์ง๋ง, ์ ๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ์ฝ์ ๋ ๊ฑฐ์ ๋ณด์ง ์์ต๋๋ค.
์ค๋ฅ๋ ์ฒ๋ฆฌํ๊ธฐ ์ํด defer
๋ฅผ ์ค๋ฒ๋ก๋ํ๋ ์คํธ๋ ๋ช
ํํ์ง ์๊ณ ํผ๋์ค๋ฝ์ต๋๋ค. ์ ํค์๋ defer
์
๋๊น? defer
๋ _"๋์ค์ ํ ์ ์์"์ด ์๋๋ผ _"๋์ค์ ํ ๊ฒ"_์ ์๋ฏธํ์ง ์์ต๋๊น?
๋ํ Go ํ์ด defer
์ฑ๋ฅ ์ ๋ํด ์ธ๊ธํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ๊ฐ์ํ ๋ defer
๊ฐ _"hot path"_ ์ฝ๋ ํ๋ฆ์ ๋ํด ๊ณ ๋ ค๋๊ณ ์๋ค๋ ๊ฒ์ ๋ ๋ฐฐ๋ก ๋ถํํ ๊ฒ ๊ฐ์ต๋๋ค.
@prologic ์ด ์ธ๊ธํ๋ฏ์ด ์ด try()
์ ์์ ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ ์ฝ๋์ ๋ง์ ๋ถ๋ถ์ ๊ทผ๊ฑฐํ ๊ฒ์
๋๊น, ์๋๋ฉด Go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๋ถํํ๋ ์ฌ๋๋ค์ ๋ฌ๋๊ธฐ ์ํ ์๋์ ๊ธฐ๋ฐํ ๊ฒ์
๋๊น?
๋ชจ๋ ํ์ผ์ ์ฒ ์ ํ ๊ฒํ ํ๊ณ ๋ฉ๋ชจํ์ง ์๊ณ ๋ด ์ฝ๋ ๊ธฐ๋ฐ์์ ํต๊ณ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์ถ์ต๋๋ค. @prologic ์ด ๊ธฐ๋ปํ๋ฉด์๋ ์ด๋ป๊ฒ ํ ์ ์์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ผํ์ ๋ฐ๋ฅด๋ฉด try()
๊ฐ ๋ด ์ฌ์ฉ ์ฌ๋ก์ 5%๋ฅผ ์ฒ๋ฆฌํ๊ณ 1% ๋ฏธ๋ง์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์์ฌํ๋ฉด ๋๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ๋งค์ฐ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค๋ ๊ฒ์ ํ์คํ ์๊ณ ์์ต๋๊น? ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์งํฉ์ ๊ฐ์ ธ ์์ ์ด๋ป๊ฒ ์ ์ฉํ ์ง ํ์ธํ๋ ค๊ณ ํ์ต๋๊น?
์ด๊ฒ์ด ์ผ์์ ๋ง์ ์ฝ๋์ ์ ํฉํ๋ค๋ ์๋ ค์ง ํต๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ฌ๋์ด ์๋ก์ด ๊ฐ๋ ์ ๋ฐฐ์์ผ ํ๋ ์ธ์ด์ ๋ํ ์ด ๋ณต์กํ๊ณ ์๋ก์ด ๋ณ๊ฒฝ์ด ์ค์ ๋ก ๋งค๋ ฅ์ ์ธ ์์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๊น?
์ด๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ์์ ํ ๋ฐ๋ณตํ ๊ฒ์ด์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก try()
๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ค์์ ๋จ์ํ idomatic ์ฝ๋๋ก ์์ฉํ๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๋ฉด์์ ์ ์ฌํ๋ฉฐ ์ด๊ฒ์ ์ด๋ค ์ฝ๋์๋ ์ ๋ ๋ค์ด๊ฐ์ง ์๋ ์ฝ๋์
๋๋ค. -๊ฐ๋ฐ์ ๋ฐฐ์ก ์กด์ค:
f, _ := os.Open(filename)
๋๋ ๋ด ์์ ์ ์ฝ๋๋ฅผ ๋ ์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์์ฒญ๋๊ฒ ์ ์ฉํ ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ๋ค๋ฅธ Go ๊ฐ๋ฐ์๋ค์๊ฒ ์์กดํ๊ณ ์๋ค๋ ๊ฒ๋ ์๋๋ค. ๊ทธ๋ฌ๋ _"Other People's Code(tm)"_ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ ์ข ์ข ๋ฌด์๋ฉ๋๋ค.
์ ๋ง ์ง์งํ๊ฒ, ๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ๋ฌด์ํ๊ณ GitHub๋ฅผ ๊ฒฌ๊ณ ํ์ง ์์ ํจํค์ง๋ก ๋๋ฝํ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๊น?
try()
๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.๋ด๊ฐ ์ ์์ ์คํดํ์ง ์๋ ํ - ์๋ง๋ ๊ทธ๋ด ๊ฒ์
๋๋ค - ์ฌ๊ธฐ์ try()
๊ฐ userland ์์ ๊ตฌํ๋ Go Playground ๊ฐ ์์ต๋๋ค . ๋น๋ก ํ๋์ ๋ฐํ ๊ฐ๊ณผ ์์ ์ ํ ๋์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํ์ง๋ง:
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
defer func() {
r := recover()
if r != nil && strings.HasPrefix(r.(string),"TRY:") {
fmt.Printf("Ouch! %s",strings.TrimPrefix(r.(string),"TRY: "))
}
}()
n := try(badjuju()).(int)
fmt.Printf("Just chillin %dx!",n)
}
func badjuju() (int,error) {
return 10, errors.New("this is a really bad error")
}
func try(args ...interface{}) interface{} {
err,ok := args[1].(error)
if ok && err != nil {
panic(fmt.Sprintf("TRY: %s",err.Error()))
}
return args[0]
}
๋ฐ๋ผ์ ์ฌ์ฉ์๋ ๋ฐํํด์ผ ํ๋ ๋ฐํ ๊ฐ์ ์์ ๋ฐ๋ผ try2()
, try3()
๋ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Go๋ try()
๋ฅผ ์ํ๋ ์ฌ์ฉ์๊ฐ ์์ ์ ์ง์์ ๋กค๋ฐฑํ ์ ์๋๋ก ํ๋ ๋จ์ ํ์ง๋ง ๋ณดํธ์ ์ธ ์ธ์ด ๊ธฐ๋ฅ์ด ํ๋๋ง ํ์ํฉ๋๋ค. Go func
์ ๋ํด _(์์ ํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋)_ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ๋ค์ํ ์์ ๋ฐํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์:
func try(args ...interface{}) ...interface{} {
err,ok := args[1].(error)
if ok && err != nil {
panic(fmt.Sprintf("TRY: %s",err.Error()))
}
return args[0:len(args)-2]
}
๊ทธ๋ฆฌ๊ณ ์ ๋ค๋ฆญ์ ๋จผ์ ๋ค๋ฃจ๋ฉด ํ์ ์ด์ค์ ์ด ํ์ํ์ง ์์ ๊ฒ์ ๋๋ค _(์ ๋ค๋ฆญ์ ์ฌ์ฉ ์ฌ๋ก๋ ํผ๋์ค๋ฌ์ด ์๋ฏธ ์ฒด๊ณ์ ์ ๋ค๋ฆญ์ ๊ตฌ๋ฌธ ์๋ฌ๋๋ฅผ ์ถ๊ฐํ๋ ๋์ ์ ๋ค๋ฆญ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ด์ฅ์ ์ถ๊ฐํ์ฌ ์ถ์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์๋ฐ ๋ฑ)_
์ ์์ ์ฝ๋๋ฅผ ์ฐ๊ตฌํ ๋ ๋์์ด ๋ช ํํ์ง ์๊ณ ์ถ๋ก ํ๊ธฐ๊ฐ ๋ค์ ์ด๋ ต๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
try()
๊ฐ ํํ์์ ๋ํํ๋ ๊ฒ์ ๋ณผ ๋ ์ค๋ฅ๊ฐ ๋ฐํ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์ค๋ฅ๊ฐ ๊ทธ๋ฅ ๋ฌด์๋ฉ๋๊น? ์๋๋ฉด ์ฒซ ๋ฒ์งธ ๋๋ ๊ฐ์ฅ ์ต๊ทผ์ defer
๋ก ์ ํํ ๊น์? ๊ทธ๋ ๋ค๋ฉด ์๋์ผ๋ก err
๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ํด๋ก์ ๋ด๋ถ์ ์ค์ ํ๊ฑฐ๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ๊ฒ์
๋๋ค _(I ๋งค๊ฐ๋ณ์๊ฐ ๋ณด์ด์ง ์์ต๋๊น?)_. ์๋ ์ค๋ฅ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์ ํฉ๋๊น? ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๋ด ํจ์์์ ๋ด err
๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค๋ ์๋ฏธ์
๋๊น?
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ defer
๋ฅผ ํธ์ถํฉ๋๊น? ์ญ์์ผ๋ก ๋๋ ์ผ๋ฐ ์์๋ก?
์๋๋ฉด ํด๋ก์ ์ ์ค๋ฅ๊ฐ ๋ฐํ๋ func
๋ชจ๋์์ ๋ฐํ๋ฉ๋๊น? _(์ฌ๊ธฐ์์ ๊ทธ๊ฒ์ ์๋ฏธํ๋ ๋จ์ด๋ฅผ ์ฝ์ง ์์๋ค๋ฉด ๊ฒฐ์ฝ ๊ณ ๋ คํ์ง ์์์ ๊ฒ์
๋๋ค.)_
์ ์์์ ์ง๊ธ๊น์ง์ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์ ํ์๋ ์์งํ ์์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ _"Captain Obvious"_๋ฅผ ์นํธํ๋ ์ธ์ด์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ ๋๊น?
defer
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ _(๊ฐ์ฅ ์ต๊ทผ์?)_ defer
๋ก ๋ถ๊ธฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ํ func
์ด์ธ์ ๋ฐฉ๋ฒ์ ๋ํ ์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค.
์ข
์ข
func
๋ด์์ ๋๋ package
๋ด์์ ์ค๋ฅ ์ฒ๋ฆฌ ์ธก๋ฉด์ ๊ณต์ ํ๋ ๊ฒ์ด ๋์์ด ๋์ง๋ง ํ๋ ์ด์์ ๋ค๋ฅธ ํจํค์ง์์ ๋ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ๋์์ด ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค๋ฅธ func
๋ด์์ error()
func
ํธ์ถ 5๊ฐ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. A()
, B()
, C()
, D()
๋ฐ E()
๋ ์ด๋ธ์ ์ง์ ํ๊ฒ ์ต๋๋ค. ์์ฒด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด C()
, ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ค๋ฉด A()
, B()
, D()
, E()
๊ฐ ํ์ํ ์ ์์ต๋๋ค. ๋ฐ B()
๋ฐ E()
๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ด ์ ์์ผ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๊ณ ๋ฏฟ์ง ์์ต๋๋ค. ์ ์ด๋ ์ฝ์ง๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ด๋ฌ๋ํ๊ฒ๋ Go์๋ ์์ ์ฌ์ฉ ์ฌ๋ก ์งํฉ์ผ๋ก ์ ํ๋ ํ์๊ฐ ์๋ ๋์ ์์ค์ ์ ์ฐ์ฑ์ ํ์ฉํ๋ ์ธ์ด ๊ธฐ๋ฅ์ด ์ด๋ฏธ ์์ต๋๋ค. func
๋ฐ ํ์. ์ ์์ฌํ์ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_ "์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ๊ธฐ์กด ์ธ์ด์ ์ฝ๊ฐ์ ๊ฐ์ ์ฌํญ์ ์ถ๊ฐํ ์ ์๊ณ ์๋ก์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ํผ๋์ค๋ฌ์ด ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ์๋ค์ผ ํ์๊ฐ ์์ต๋๊น?" _
๋ด๊ฐ ์ด ์ ์์ ์ฐ๊ตฌํ๋ ๋์ ์๊ฐํ ๋์์ผ๋ก ์ ์์ ์ ์ถํ ๊ณํ์ด๊ธฐ ๋๋ฌธ์ ์์ฌํ์ ์ง๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ฌ๋ด์ ๋๋ค. ๊ทธ๊ฒ์ ๋์ค์ ์ฌ ๊ฒ์ด๋ฉฐ ์ด ์๊ฒฌ์ ํ์ฌ ์ ์์ ์ฌ๊ณ ํด์ผ ํ๋ ์ด์ ์ ๋ํ ๊ฒ์ ๋๋ค.
break
์ ๋ํ ๋ช
์์ ์ง์ ๋ถ์กฑ์ด๊ฒ์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์กฐ๊ธฐ ๋ฐํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ ํ๋์์ ๋์ค๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง ์ ์์ง๋ง $# ์ด์ ์ ํจ์์ ๋๋ถ๋ถ ๋๋ ์ ์ฒด๋ฅผ ๋ํํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด break
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ์์์ต๋๋ค return
.
๋๋ ์ ์ ๋์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํด ์์ผ๋ฉฐ ๋ฆฌํฉํ ๋ง์ ์ํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ด๊ธฐ return
๋ณด๋ค ์ ํธ๋์ง๋ง ๋จ์ผ ์ข
๋ฃ ์ง์ ๋ฐ ํจ์์ ์น์
์ ์กฐ๊ธฐ์ ์ข
๋ฃํ ์ ์๋ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ด์ ์ด ์์ง๋ง ์ฌ์ ํ ์ ๋ฆฌ๋ฅผ ์คํํ ์ ์์ _(์๋ง๋ ๋ด๊ฐ defer
๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ์ผ ๊ฒ์
๋๋ค. ํ๋ก๊ทธ๋จ ํ๋ฆ ์ธก๋ฉด์์ ์ถ๋ก ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.)_
์กฐ๊ธฐ ๋ฐํ ๋์ break
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด for range "1" {...}
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ _(์ค์ ๋ก๋ ์์๋ง ํฌํจํ๋ only
๋ผ๋ ํจํค์ง๋ฅผ ์์ฑํฉ๋๋ค. Once
#$6$#$ ๊ฐ์ผ๋ก "1"
):_
func (me *Config) WriteFile() (err error) {
for range only.Once {
var j []byte
j, err = json.MarshalIndent(me, "", " ")
if err != nil {
err = fmt.Errorf("unable to marshal config; %s",
err.Error(),
)
break
}
err = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
if err != nil {
err = fmt.Errorf("unable to make directory'%s'; %s",
me.GetDir(),
err.Error(),
)
break
}
err = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
if err != nil {
err = fmt.Errorf("unable to write to config file '%s'; %s",
me.GetFilepath(),
err.Error(),
)
break
}
}
return err
}
๋๋ ๊ฐ๊น์ด ์ฅ๋์ ํจํด์ ๋ํด ๊ธธ๊ฒ ๋ธ๋ก๊ทธ์ ์ฌ๋ฆด ๊ณํ์ด๋ฉฐ, ์ด๊ธฐ ์์ต๋ณด๋ค ๋ ๋์ ํจ๊ณผ๋ฅผ ๋ฐ๊ฒฌํ ๋ช ๊ฐ์ง ์ด์ ์ ๋ํด ๋ ผ์ํ ์์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๋น๋๊ฐ๋ค. ์ฌ๊ธฐ์์ ๊ฐ์ ธ์จ ์ด์ ๋ Go์์ ์ด๊ธฐ return
๋ฅผ ๊ฐ์ ํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด break
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฌด์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
err == nil
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.๋ ๋์๊ฐ Go์ ๊ด์ฉ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๋๊ผ๋ ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ Go์ ์ฒ ํ์ ํฌ๊ฒ ์ ๋ดํ์ง๋ง ์ค๋ฅ๊ฐ ์์์ ๋ํ๋ด๊ธฐ ์ํด nil
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฃจํด โ API ์๋ต์ ์ฌ์ฉ โ ์ค๋ฅ๊ฐ ์์ ๋๋ง nil์ด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ์๋๋๋ค .
๊ทธ๋์ Go 2์ ๊ฒฝ์ฐ Go๊ฐ status
์ ์๋ก์ด ๋ด์ฅ ์ ํ๊ณผ ์ธ ๊ฐ์ ๋ด์ฅ ํจ์ iserror()
, iswarning()
, issuccess()
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์ถ์ต๋๋ค. status
๋ error
๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. โ ๋ง์ ์ญํธํ์ฑ์ ํ์ฉํ๊ณ issuccess()
์ ์ ๋ฌ๋ nil
๊ฐ์ true
$๋ฅผ ๋ฐํํ์ง๋ง status
์๋ ์ค๋ฅ ์์ค์ ๋ํ ์ถ๊ฐ ๋ด๋ถ ์ํ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ฅ ์์ค์ ๋ํ ํ
์คํธ๋ ํญ์ ๋ด์ฅ ํจ์ ์ค ํ๋๋ก ์ํ๋๋ฉฐ ์ด์์ ์ผ๋ก๋ nil
๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋์ ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ด ํ์ฉ๋ฉ๋๋ค.
func (me *Config) WriteFile() (sts status) {
for range only.Once {
var j []byte
j, sts = json.MarshalIndent(me, "", " ")
if iserror(sts) {
sts.AddMessage("unable to marshal config")
break
}
sts = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
if iserror(sts) {
sts.AddMessage("unable to make directory'%s'", me.GetDir())
break
}
sts = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
if iserror(sts) {
sts.AddMessage("unable to write to config file '%s'",
me.GetFilepath(),
)
break
}
sts = fmt.Status("config file written")
}
return sts
}
์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ ์ ์ฌํ ํ์ฌ ๋ด๋ถ ์ฌ์ฉ ํจํค์ง์ธ ๋ฒ ํ ์ด์ ์์ค ์์ ์ด๋ฏธ ์ฌ์ฉ์ ์์ญ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์์งํ ๋๋ ๊ด์ฉ์ ์ธ Go ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ค๊ณ ํ ๋๋ณด๋ค ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๋ ์ฝ๋๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ ๋ฐ ํจ์ฌ ์ ์ ์๊ฐ์ ํ ์ ํฉ๋๋ค .
์ด ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๊ด์ฉ์ ์ธ Go ์ฝ๋๋ฅผ ๋ฐ์ ์ํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ด try()
์ ์์ ๊ณ ๋ คํ ๋๋ฅผ ํฌํจํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ๋ ์ด๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
Go ํ์ ์ฃผ์ ์๋ต ์ค ํ๋๋ _"๋ค์ ๋งํ์ง๋ง, ์ด ์ ์์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ํฉ์ ํด๊ฒฐํ๋ ค๋ ์๋๋ ์๋๋๋ค."์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์๋ง๋ ๊ฑฐ๋ฒ๋์ค ๊ด์ ์์ ๊ฐ์ฅ ๊ณจ์น ์ํ ๋ฌธ์ ์ผ ๊ฒ์
๋๋ค.
๋ชจ๋ ์ฌ๋์ด ์๋ก์ด ๊ฐ๋ ์ ๋ฐฐ์์ผ ํ๋ ์ด ๋ณต์กํ๊ณ ๋ณต์กํ ์ธ์ด ๋ณ๊ฒฝ์ด ์ ๋ง ๋ง์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํฉ๋๊น?
๊ทธ๋ฆฌ๊ณ ํต์ฌ ํ์ ๋์ผํ ์ ๋น ๊ตฌ์ฑ์์ด ์ปค๋ฎค๋ํฐ์ ์๋ง์ ๊ธฐ๋ฅ ์์ฒญ์ ๊ฑฐ๋ถํ ๊ฒ์ด ์๋๋๊น? ๋ค์์ ์ฝ 2๋ ์ ์ ์ ์ถ๋ ๊ธฐ๋ฅ ์์ฒญ์ ๋ํ ์ ํ์ ์ธ ์๋ต์์ Go ํ ๊ตฌ์ฑ์์ด ํ ์๊ฒฌ์์ ์ง์ ์ธ์ฉํ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์๋๋ผ ์ธ์ด์ ๋ํด):_
_"์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์๋ ๊ฐ๋ ฅํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ์ํฉ๋๋ค. ๋ชจ๋ ์ธ์ด ๊ธฐ๋ฅ์ด ์ ์ฉํ๊ฑฐ๋ ์๋ฌด๋ ์ ์ํ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ์ธ์ด๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋ชจ๋ ์ฌ๋์ด ์๋ก์ด ๊ฐ๋ ์ ๋ฐฐ์ฐ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ์ ๋นํํ ๋งํผ ์ ์ฉํฉ๋๊น? ์ค๋๋ ฅ ์๋ ์ฌ์ฉ์ ๋ฌด์์ ๋๊น? ์๋ฅผ ๋ค์ด, ์ฌ๋๋ค์ ์ด๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น์? ์๋ฅผ ๋ค์ด, ์ฌ๋๋ค์ ... ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ์๊ฒ ์ต๋๊น? ์ด ์ ์์ ... ์ด์์ ๊ธฐ๋ฅ์ ํฉ๋๊น?"_
โ Go ํต์ฌ ํ์
์์งํ ๊ทธ ๋ฐ์์ ๋ณด์์ ๋ ๋๋ ๋ ๊ฐ์ง ๊ฐ์ ์ค ํ๋๋ฅผ ๋๊ผ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ด ๊ฐ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋๋ ๋ฐ๋์ด ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๊ฐ๋ฐํ๊ธฐ๋ก ์ ํํ ์ธ์ด์ ์ผ๋ถ๊ฐ ์ธ์ด์ ์์์ฑ์ ์งํฌํ๊ฒ ๋ณดํธํ๊ธฐ ๋๋ฌธ์ด๋ผ๋ ๊ฒ์ ์ดํดํ๊ณ ๋์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ฐ๋ก ์ด ์ ์์ด ์ ๋ฅผ ํ๋ค๊ฒ ํ๋ ์ด์ ์ ๋๋ค. Go ํต์ฌ ํ์ ์ด ์ ์์ Go ์ปค๋ฎค๋ํฐ์์ ์ ๋ ์ฉ๋ฉํ ์ ์๋ ๋ํดํ ๊ธฐ๋ฅ์ ๋ ๋จ์ ์ผ๋ก ์ํ๋ ์ฌ๋๊ณผ ๊ฐ์ ์์ค์ผ๋ก ์ด ์ ์์ ํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
_(๊ทธ๋ฆฌ๊ณ ๋๋ ํ์ด ๋ฉ์ ์ ๋ฅผ ์์ง ์๊ณ ๋ฐ๋์ด ๊ณ์ํด์ ์ต๊ณ ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋๊ตฐ๊ฐ์ ๊ฑด์ค์ ์ธ ๋นํ์ผ๋ก ๋ฐ์๋ค์ด๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค. ํต์ฌ ํ.)_
์ค๋๋ ฅ ์๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก ์งํฉ์ ์๊ตฌํ๋ ๊ฒ์ด ๋ชจ๋ ์ปค๋ฎค๋ํฐ ์์ฑ ๊ธฐ๋ฅ ์ ์์ ๋ํ ๊ธฐ์ค์ด๋ผ๋ฉด _ ๋ชจ๋ _ ๊ธฐ๋ฅ ์ ์์ ๋ํด์๋ ๋์ผํ ๊ธฐ์ค์ด ๋์ด์ผ ํ์ง ์์๊น์?
์ด๊ฒ ์ญ์ ๋ช๋ช์ ์ํด ๋ค๋ฃจ์ด์ก์ง๋ง, ๋๋ try()
์ ์ผํญ ์ฐ์ฐ์์ ๋ํ ๊ณ์๋๋ ์์ฒญ์ ๋น๊ตํ๊ณ ์ถ์ต๋๋ค. ์ฝ 18๊ฐ์ ์ ๋ค๋ฅธ ๋ฐ๋ ํ์์ ๋ง ์ธ์ฉ:
_""๋๊ท๋ชจ ํ๋ก๊ทธ๋๋ฐ"(์ค๋ ๊ธฐ๊ฐ์ ๊ฑธ์ณ ๋๊ท๋ชจ ํ์ด ์๋ ๋๊ท๋ชจ ์ฝ๋ ๊ธฐ๋ฐ)์ธ ๊ฒฝ์ฐ ์ฝ๋๋ ์์ฑ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ์ฝํ๋ฏ๋ก ์ฐ๊ธฐ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ๋ ์ฑ์ ์ํด ์ต์ ํํฉ๋๋ค."_
์ผํญ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ์ง ์๋ _primary_ ์ธ๊ธ๋ ์ด์ ์ค ํ๋๋ ์ค์ฒฉ๋ ๋ ์ฝ๊ธฐ ์ด๋ ต๊ฑฐ๋ ์๋ชป ์ฝ๊ธฐ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ try(try(try(to()).parse().this)).easily())
์ ๊ฐ์ ์ค์ฒฉ๋ try()
๋ฌธ์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์ผํญ ์ฐ์ฐ์ ์ ๋ฐ๋ํ๋ ๋ ๋ค๋ฅธ ์ด์ ๋ ์ค์ฒฉ๋ ํํ์์ด ๋ณต์ก์ฑ์ ์ถ๊ฐํ ์ ์๋ค๋ ์ฃผ์ฅ์ด ์๋ _"ํํ์"_์ด๋ผ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ try()
๋ ์ค์ฒฉ ๊ฐ๋ฅํ ํํ์์ ์์ฑํ์ง ์์ต๋๊น?
์ด์ ์ฌ๊ธฐ ๋๊ตฐ๊ฐ๊ฐ _"๋ด ์๊ฐ์ [์ค์ฒฉ๋ try()
s]์ ๊ฐ์ ์๋ ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค."_ ๊ทธ ์ง์ ์ ์ด์๋ฅผ ์ ๊ธฐํ์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด ๊ฐ๋ฐ์๊ฐ try()
๋ฅผ ์ค์ฒฉํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฐ์ ์ ๋ฐ์๋ค์ธ๋ค๋ฉด ์ฌ๋๋ค์ด _"๊น๊ฒ ์ค์ฒฉ๋ ์ผํญ ์ฐ์ฐ์๋ ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค."_๋ผ๊ณ ๋งํ ๋ ์ผํญ ์ฐ์ฐ์์ ๋ํด ๋์ผํ ์กด์ค์ด ์ฃผ์ด์ง์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ด ์ ์ ๋ํ ๊ฒฐ๋ก ์ ์ผํญ ์ฐ์ฐ์ ์ ๋ํ ์ฃผ์ฅ์ด ์ค์ ๋ก ์ ํจํ๋ค๋ฉด ์ด try()
์ ์์ ๋ํ ์ ํจํ ์ฃผ์ฅ์ผ๋ก๋ ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๊ธ์ ์ฐ๋ ์์ ์์ 58%
๋ฐ๋ ํฌํ๋ 42%
์ฐฌ์ฑ ํฌํ์
๋๋ค. ๋๋ ์ด๊ฒ๋ง์ผ๋ก๋ ์ด ๋ฌธ์ ์ ๋ํด ๋ค์ ๋
ผ์ํด์ผ ํ ์์ ์ด๋ผ๋ ์ ์์ด ์ถฉ๋ถํ ๋ถ์ด์ ์์ ๋ํ๋ด๊ธฐ์ ์ถฉ๋ถํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ถ์ : ์ข ๋ ๋๋ด์ผ๋ก ํํํ์๋ฉด Yoda์ ์งํ๋ฅผ ์์ญํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
_"
try()
์ด(๊ฐ) ์์ต๋๋ค.do()
์์ต๋๋ค."_
@ianlancetaylor
@beoran ์๋ง๋ ์ ๋ค๋ฆญ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ ๊ฐ์ ์ฐ๊ฒฐ์ ํ์ฅํ ์ ์์ต๋๋ค.
@beoran ์ ๋ํด ๋งํ๋ ๊ฒ์ด ์๋๋ผ ๋ช ๋ถ ์ ์ ์๊ฒฌ์์ ์ ๋ค๋ฆญ _(๊ฐ๋ณ ๋ฐํ ๋งค๊ฐ๋ณ์ ํฌํจ)_์ด ์๋ค๋ฉด ์ฐ๋ฆฌ ๊ณ ์ ์ try()
๋ฅผ ๋น๋ํ ์ ์์์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ โ ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ ๋ค๋ฆญ์ ๋ํด ์์์ ๋งํ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ณผ ์ ์๋๋ก ์ฌ๊ธฐ์์ ๋ฐ๋ณตํ ๊ฒ์ ๋๋ค.
_" ์ ๋ค๋ฆญ์ ์ ์ค ์ผ์ด์ค๋ Java ๋ฑ์ ํผ๋์ค๋ฌ์ด ์๋ฏธ ์ฒด๊ณ์ ์ ๋ค๋ฆญ ๊ตฌ๋ฌธ ์๋ฌ๋๋ฅผ ์ถ๊ฐํ๊ธฐ๋ณด๋ค๋ ์ ๋ค๋ฆญ์ ์ ์ค ์ผ์ด์ค๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ด์ฅ์ ์ถ๊ฐํ์ฌ ์ถ์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.)"_
@ianlancetaylor
๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๊ณต์ํํ๋ ค๊ณ ํ ๋ Go์์ try
๊ธฐ๋ฅ์ ์๋ ๊ทธ๋๋ก ๊ตฌํํ๋ ค๊ณ ์๋ํ์ผ๋ฉฐ ๊ธฐ์๊ฒ๋ ์ค์ ๋ก ์ด๋ฏธ ๋งค์ฐ ์ ์ฌํ ๊ฒ์ ์๋ฎฌ๋ ์ดํธํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
func try(v interface{}, err error) interface{} {
if err != nil {
panic(err)
}
return v
}
์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์: https://play.golang.org/p/Kq9Q0hZHlXL
์ด ์ ๊ทผ ๋ฐฉ์์ ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ค๋ฉด ์ง์ฐ๋ ์ฒ๋ฆฌ๊ธฐ๋ ํ์ํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ด๊ฒ์ด ์ฌ๊ฐํ ๋จ์ ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go์ ์ผ์ข
์ super(arg1, ..., argn)
๋ด์ฅ์ด ์์ผ๋ฉด ํธ์ถ ์คํ์ ํ ๋จ๊ณ ์์ธ ํธ์ถ์์ ํธ์ถ์๊ฐ ์ฃผ์ด์ง ์ธ์ arg1,...argn, ์ผ์ข
์ ์ํผ ๋ฆฌํด์ผ๋ก ๋ฐํํ๋๋ก ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋์ ์ ์์ต๋๋ค. ๋น์ ์ด ํ ๊ฒฝ์ฐ.try
๋ ๋จ์ผ ๊ฒฐ๊ณผ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์์์๋ง ์๋ํ ์ ์์ต๋๋ค.์ถฉ๋ถํ ๊ฐ๋ ฅํ ์ ๋ค๋ฆญ์ ๋ฌธ์ 2์ 3์ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ super()
๋ฅผ ์ถ๊ฐํ์ฌ ํด๊ฒฐํ ์ ์๋ 1๊ฐ๋ง ๋จ๊น๋๋ค. ์ด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
func (T ... interface{})try(T, err error) super {
if err != nil {
super(err)
}
super(T...)
}
๊ทธ๋ฌ๋ฉด ์ฐ๊ธฐ๋ ๊ตฌ์กฐ๋ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด ์ด์ ์ Go์ ์ ๋ค๋ฆญ์ด ์ถ๊ฐ๋์ง ์์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฌ์ค, super() ๋ด์ฅ์ ๋ํ ์ด ์์ด๋์ด๋ ๋๋ฌด ๊ฐ๋ ฅํ๊ณ ํฅ๋ฏธ๋ก์์ ๋ฐ๋ก ์ ์์ ๊ฒ์ํ ์๋ ์์ต๋๋ค.
@beoran ๋์ฒด ์ ์์์ ๋น์ทํ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ํฌํจํ์ง ์์ ์์ โโ๋ถ๋ถ์ ์ ์ธํ๊ณ ์ฌ์ฉ์ ์์ญ์์ try()
๋ฅผ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ๋
๋ฆฝ์ ์ผ๋ก ์ ํํ ๋์ผํ ์ ์ฝ ์กฐ๊ฑด์ ๋๋ฌํ ๊ฒ์ ๋ณด๋ ๋ฐ๊ฐ์ต๋๋ค. :-)
๋๋ ๊ทธ ์ ์์ด ๋ง์์ ๋ค์ง๋ง defer try(...)
๋ฐ go try(...)
๊ฐ ํ์ฉ๋์ง ์๋๋ค๊ณ ๋ช
์์ ์ผ๋ก ์ง์ ํด์ผ ํ๋ค๋ ์ฌ์ค์ด ๋ญ๊ฐ ์๋ชป๋์๋ค๋ ์๊ฐ์ ํ๊ฒ ๋ง๋ค์์ต๋๋ค.... ์ง๊ต์ฑ์ ์ข์ ๋์์ธ ๊ฐ์ด๋์
๋๋ค. ๋ ์ฝ๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ณผ ๋
x = try(foo(...))
y = try(bar(...))
try
๊ฐ ์ปจํ
์คํธ ์ฌ์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค! ๊ณ ๋ คํ๋ค:
try (
x = foo(...)
y = bar(...)
)
์ฌ๊ธฐ์ foo()
๋ฐ bar()
๋ ๋ ๊ฐ์ ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋ ๋ฒ์งธ ๊ฐ์ error
์
๋๋ค. ์๋ฏธ ์ฒด๊ณ๋ฅผ ์๋ํ๋ ๊ฒ์ ๋ฐํ๋ ์ค๋ฅ ๊ฐ์ด ์๋ต ๋๋(์์ ์ ์์) try
๋ธ๋ก ๋ด ํธ์ถ์ ๋ํด์๋ง ์ค์ํ์ง๋ง ๋ฐ๋๋ก ๋ฌด์ ๋ฉ๋๋ค(์์ ์๋ _
์). foo
์ bar
ํธ์ถ ์ฌ์ด์์ ์ผ๋ถ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค.
์์ฝ:
a) go
๋ฐ defer
$์ ๋ํด $ try
๋ฅผ ํ์ฉํ์ง ์๋ ๋ฌธ์ ๋ ๊ตฌ๋ฌธ ๋๋ถ์ ์ฌ๋ผ์ง๋๋ค.
b) ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
c) ๊ทธ๊ฒ์ ๋ง๋ฒ ๊ฐ์ ์ฑ์ง์ ํจ์ ํธ์ถ๋ณด๋ค ํน๋ณํ ๊ตฌ๋ฌธ์ผ๋ก ๋ ์ ํํ๋ฉ๋๋ค.
try๊ฐ ์ปจํ ์คํธ๋ผ๋ฉด ์ฐ๋ฆฌ๋ ํน๋ณํ ํผํ๋ ค๊ณ ํ๋ try/catch ๋ธ๋ก์ ๋ง๋ ๊ฒ์ ๋๋ค.
์บ์น๊ฐ ์์ต๋๋ค. ํ์ฌ ์ ์์๊ฐ ์์ ๋์ ๋๊ฐ์ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
x = try(foo(...))
y = try(bar(...))
์ด๊ฒ์ ์๋ฏธ๊ฐ ์๋ ๋ค๋ฅธ ๊ตฌ๋ฌธ์
๋๋ค.
````
์์ง ๋ช ๊ฐ์ง ๋จ์ ์ด ์๊ธฐ๋ ํ์ง๋ง ํ์ง ๋ง์์ด์ผ ํ๋ ๋ช ๊ฐ์ง ๊ฐ์ ์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
foo ๋๋ bar๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด try ์ปจํ ์คํธ์๋ ๋ฐฐ์น๋ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ค๋ฅ ๊ธฐ๋ฅ๊ณผ ์ค๋ฅ๊ฐ ์๋ ๊ธฐ๋ฅ ์ฌ์ด๋ฅผ ์ ํํ๋ ๊ฒ์ด ๋ค์ ์ถํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ์ด์ ์ธ์ด์ try ๋ธ๋ก ๋ฌธ์ ๋ก ๋๋์๊ฐ๋๋ค.
๋ ๋ฒ์งธ๋ ์ผ๋ฐ์ ์ผ๋ก keyword ( ... )
๊ตฌ๋ฌธ์์ ๊ฐ ์ค์ ํค์๋ ์ ๋์ฌ๋ฅผ ๋ถ์ธ๋ค๋ ์๋ฏธ์
๋๋ค. ๋ฐ๋ผ์ import, var, const ๋ฑ์ ๊ฒฝ์ฐ: ๊ฐ ํ์ ํค์๋๋ก ์์ํฉ๋๋ค. ๊ทธ ๊ท์น์ ๋ํ ์์ธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ข์ ๊ฒฐ์ ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋์ ํน์ ์๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ด์ฉ์ ์ ๋๊น?
๊ฐ์ ๋ฌด์ํ๋ ๋น ์๋ณ์ _
๊ฐ ์ด๋ฏธ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ #
์ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๊ฒ์ error ์ ํ์ ๋ง์ง๋ง ๋ฐํ ๊ฐ์ด ์๋ ํจ์์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
func foo() (error) {
f, # := os.Open()
defer f.Close()
_, # = f.WriteString("foo")
return nil
}
#
์ ์ค๋ฅ๊ฐ ํ ๋น๋๋ฉด ํจ์๋ ์์ ๋ ์ค๋ฅ์ ํจ๊ป ์ฆ์ ๋ฐํ๋ฉ๋๋ค. ๋ค๋ฅธ ๋ณ์์ ๊ฒฝ์ฐ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@deanveloper , try
๋ธ๋ก ์๋ฏธ๋ ์ค๋ฅ ๊ฐ์ ๋ฐํํ๊ณ ์ค๋ฅ ๊ฐ์ด ํ ๋น๋์ง ์์ ํจ์์๋ง ์ค์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ ์์ ๋ง์ง๋ง ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์๋ ์์ต๋๋ค.
try(x = foo(...))
try(y = bar(...))
๋์ผํ ๋ธ๋ก ๋ด์ ๋ ๋ช
๋ น๋ฌธ์ ๋ชจ๋ ๋ฃ๋ ๊ฒ์ ๋ฐ๋ณต๋๋ import
, const
๋ฐ var
๋ช
๋ น๋ฌธ๊ณผ ์ ์ฌํฉ๋๋ค.
์ด์ ๋น์ ์ด ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์๋ฅผ ๋ค์ด
try(
x = foo(...))
go zee(...)
defer fum()
y = bar(...)
)
์ด๊ฒ์ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
try(x = foo(...))
go zee(...)
defer fum()
try(y = bar(...))
์ด ๋ชจ๋ ๊ฒ์ ํ๋์ try ๋ธ๋ก์์ ์ ์ธํ๋ฉด ๋ ๋ฐ์ฉ๋๋ค.
๊ณ ๋ คํ๋ค
try(x = foo())
foo()๊ฐ ์ค๋ฅ ๊ฐ์ ๋ฐํํ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
x = foo()
๊ณ ๋ คํ๋ค
try(f, _ := os.open(filename))
๋ฐํ๋ ์ค๋ฅ ๊ฐ์ ๋ฌด์๋๋ฏ๋ก ์ด๋ ๋ค์๊ณผ ๋์ผํฉ๋๋ค.
f, _ := os.open(filename)
๊ณ ๋ คํ๋ค
try(f, err := os.open(filename))
๋ฐํ๋ ์ค๋ฅ ๊ฐ์ ๋ฌด์ ๋์ง ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
f, err := os.open(filename)
if err != nil {
return ..., err
}
ํ์ฌ ์ ์์์ ๋ช
์๋ ๋๋ก.
๋ํ ์ค์ฒฉ๋ ์๋๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํฉ๋๋ค!
๋ค์์ ์์์ ์ธ๊ธํ ๋์ฒด ์ ์์ ๋ํ ๋งํฌ์ ๋๋ค.
try()
์ ๋์ผํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด 2๊ฐ์ ์์ง๋ง ๋ฒ์ฉ ์ธ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
func
/closure๋ฅผ ํธ์ถํ๋ ๊ธฐ๋ฅ.break
, continue
๋๋ return
์ด์์ ๋ ๋ฒจ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด _"๋ง์ "์ด ๋์ง ์์ผ๋ฉฐ, ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๊ณ ์ฐ๋ฆฌ ๋ชจ๋์๊ฒ ์น์ํ ๊ด์ฉ์ Go ์ฝ๋์ ๋ ์ผ์นํ๋ Go ์ฝ๋๊ฐ ์์ฑ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
๋๋ ์ ์์ ์ฝ์๊ณ ์๋๊ฐ ์ด๋๋ก ๊ฐ๊ณ ์๋์ง ์ ๋ง ์ข์ํฉ๋๋ค.
์๋๊ฐ ์ผ๋ง๋ ๋๋ฆฌ ํผ์ง ๊ฒ์ธ์ง๋ฅผ ๊ฐ์ํ ๋ ๋ ๊ธฐ๋ณธ ๋์์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ง๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ด๊ฒ์ ์ ํจํฉ๋๋ค:
v := m[key]
๊ทธ๋๋ก:
v, ok := m[key]
try๊ฐ ์ ์ํ ๋๋ก ์ ํํ๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋ด์ฅ์ ์ ๊ฑฐํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ํ๋ฉด:
v, err := fn()
์ฐ๋ ๋์ :
v := try(fn())
๋์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
v := fn()
err ๊ฐ์ด ์บก์ฒ๋์ง ์์ผ๋ฉด try์ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ต์ํด์ง๋ ๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ์ง๋ง v, ok := m[key]
๋ฐ v, ok := x.(string)
$ ์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ ์ค๋ฅ๋ก ์ธํด ํจ์๊ฐ ๋ฐํ๋๊ณ err ๊ฐ์ด ์ค์ ๋ฉ๋๋ค.
์ค๊ณ ๋ฌธ์ ๊ฒฐ๋ก ๋ฐ ๊ตฌํ ์๊ตฌ ์ฌํญ์ผ๋ก ๋์๊ฐ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
โข ์ธ์ด ๊ตฌ๋ฌธ์ด ์ ์ง๋๊ณ ์๋ก์ด ํค์๋๊ฐ ๋์
๋์ง ์์ต๋๋ค.
โข try์ ๊ฐ์ ๊ตฌ๋ฌธ ์คํ์ด ๊ณ์ ์ฌ์ฉ๋๋ฉฐ ์ค๋ช
ํ๊ธฐ ์ฌ์ธ ๊ฒ์
๋๋ค.
โข ์๋ก์ด ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์์ต๋๋ค.
โข ์ด์ ๋ฒ์ ๊ณผ ์์ ํ ํธํ๋์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ์ฐจ์ด์ ์ด ๊ตฌ๋ฌธ ์คํ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์๋๋ผ err ํ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด try์ ๊ฑฐ์ ๋์ผํ ๊ตฌํ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ์ ์์์ CopyFile
์์ ๋ฅผ defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
func CopyFile(src, dst string) (err error) {
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
r := os.Open(src)
defer r.Close()
w := os.Create(dst)
defer func() {
err := w.Close()
if err != nil {
os.Remove(dst) // only if a โtryโ fails
}
}()
io.Copy(w, r)
w.Close()
return nil
}
@savaki ๋๋ ์ด๊ฒ์ ์ข์ํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํญ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ฌ Go๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ค์ง๊ณ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ธ์ ๊ทธ๋ ๊ฒํ์ง ์์์ง ์ง์ ํ๋๋ก(๋ณ์์ ์ค๋ฅ๋ฅผ ์บก์ฒํ์ฌ) ์ง์ ํ๋๋ก ํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ฐํ๊ณ ์์์ต๋๋ค. ์๋ณ์๋ ๋ชจ๋ ๋ฐํ ์ง์ ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ฐ๋ฅด๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ค๋ฅ๋ฅผ ๋ค๋ฅด๊ฒ ๋ฐํํ ์ ์๋ ํจ์์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ท์น์ด ์๋ํ ์ ์์ต๋๋ค(์: ๊ณต๊ฐ ์๋ณ์ ๋๋ฌธ์ ์ฌ์ฉ). ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค๋ฉด ํญ์ ?
๋ก ๋๋์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด Go๋ ํญ์ ์ค๋ฅ๋ฅผ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ try์ฒ๋ผ ํธ์ถ ํจ์์ ์๋์ผ๋ก ๋ฐํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ try ๋์ ?
์๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ ์ํ๋ ์ผ๋ถ ์ ์๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง ์ฌ๊ธฐ์ ์ค์ํ ์ฐจ์ด์ ์ ?
๊ฐ ์ถ๊ฐ ์๋ณ์๊ฐ ์๋๋ผ ํจ์ ์ด๋ฆ์ ์ผ๋ถ๋ผ๋ ๊ฒ์
๋๋ค. ์ค์ ๋ก error
๋ฅผ ๋ง์ง๋ง ๋ฐํ ๊ฐ์ผ๋ก ๋ฐํํ ํจ์๋ ?
์ ๋ฏธ์ฌ๊ฐ ์์ผ๋ฉด ์ปดํ์ผ์กฐ์ฐจ ๋์ง ์์ต๋๋ค. ๋ฌผ๋ก ?
๋ ์์์ ์ด๋ฉฐ ์๋๋ฅผ ๋ ๋ช
ํํ๊ฒ ๋ง๋๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒด๋ ์ ์์ต๋๋ค. operation?()
๋ try(someFunc())
๋ฅผ ๋ํํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ?
๋ ํจ์ ์ด๋ฆ์ ์ผ๋ถ์ด๋ฉฐ ์ ์ผํ ๋ชฉ์ ์ ํจ์๊ฐ ๋๋ฌธ์๋ก ํ์ํ๋ ๊ฒ์ฒ๋ผ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์์์ ๋ํ๋ด๋ ๊ฒ์
๋๋ค. ๋ณ์์ ์ฒซ ๊ธ์.
์ด๊ฒ์ ํ๋ฉด์ ์ผ๋ก try
๋ฅผ ?
๋ก ๋์ฒดํ๋๋ก ์์ฒญํ๋ ๋ค๋ฅธ ์ ์๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง ์ค์ํ ์ฐจ์ด์ ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์์ (์๋)์ผ๋ก ๋ง๋ค๊ณ ๋์ ๋ฌด์(๋๋ ๋ํ) ์ค๋ฅ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ง๋ ๋ค๋ ๊ฒ์
๋๋ค. ์ด์จ๋ ์ผ์ข
์ ๋ชจ๋ฒ ์ฌ๋ก์
๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ๊ฐ์ฅ ๋ช
๋ฐฑํ ๋ฌธ์ ๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ฉฐ ๋ ๋ง์ ๊ฒ์ด ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์ฆ, Go๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์๋ํํ์ฌ ๊ธฐ๋ณธ/์์์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋ฌด์/๋ฌด์ํ๋ ์ฝ๊ฐ์ ์ถ๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด๋ ๋ฐ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ด๊ฐ ์๊ฐํ๋ ๋ฌธ์ ๋ ์ด ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐํ ์ง์ ์ ๋ช
ํํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ผ๋ก ์ธํด ๋ช
ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋์์๋ ๋ฐ์ํ ์ ์๋ค๋ ์ ์์ ์์ธ์ ๋ ์ ์ฌํด์ง๊ธฐ ๋๋ฌธ์
๋๋ค. ์๊ฐ์ ํ์๊ธฐ๋ก ์ค๋ฅ๋ฅผ ์์์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ try
๋ฅผ ๊ตฌํํ๊ณ errcheck
๋ฅผ ์ปดํ์ผ๋ฌ ์คํจ๋ก ๋ง๋๋ ๊ฒ๊ณผ ๋์ผํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
์ด์ ํจ์์ ๋ํ ๋ฐ์ฝ๋ ์ดํฐ๋ก C++ ์์ธ์ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๊น?
func some_old_test() (int, error){
return 0, errors.New("err1")
}
func some_new_test() (int){
if true {
return 1
}
throw errors.New("err2")
}
func throw_res(int, e error) int {
if e != nil {
throw e
}
return int
}
func main() {
fmt.Println("Hello, playground")
try{
i := throw_res(some_old_test())
fmt.Println("i=", i + some_new_test())
} catch(err io.Error) {
return err
} catch(err error) {
fmt.Println("unknown err", err)
}
}
@owais ์๋ฏธ๋ก ์ด try์ ์ ํํ ๋์ผํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ต์ํ err ์ ํ์ ์ ์ธํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ํ๋ฉด:
func foo() error {
_, err := fn()
if err != nil {
return err
}
return nil
}
์๋ ์ ์์ ์ดํดํ๋ฉด ๊ฐ๋จํ ๋ค์์ ์ํํ์ญ์์ค.
func foo() error {
_ := fn()
return nil
}
์ปดํ์ผ๋์ง ์์ต๋๋ค. ์ข์ ํนํ ์ค ํ๋๋ ์ปดํ์ผ์ด ์ฌ์ฉ์์๊ฒ ๋๋ฝ๋ ๋ด์ฉ์ ์๋ฆด ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค๋ฅ ๋ฐํ ์ ํ์ ์ด๋ฆ์ err๋ก ์ง์ ํด์ผ ํ๋ค๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
func foo() (err error) {
_ := fn()
return nil
}
๋ณ์์ ํ ๋น๋์ง ์์ ์ค๋ฅ์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
if err != nil ๊ฒฝ์ฐ์ ๋ํ ์์์ ๋ฐํ, ํ์ํ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๋ฐํ์ ๋ํ ๋ก์ปฌ ๋ณ์ ์ด๋ฆ์ ์์ฑํ ์ ์์ผ๋ฉฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ฝ๋ ๊ฐ๋
์ฑ ๊ด์ ์์ ์ด ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ซ์ดํฉ๋๋ค.
f := os.Open("foo.txt")
๋ช ์์ ๋ฐํ์ ์ ํธํ๊ณ ์์ฑ๋ ๋งํธ๋ผ๋ณด๋ค ์ฝ๋๋ฅผ ๋ ๋ง์ด ์ฝ์ต๋๋ค.
f := os.Open("foo.txt") else return
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ฐ๋ฆฌ๋ ๋ ํ์์ ๋ชจ๋ ์์ฉํ ์ ์๊ณ gofmt๊ฐ ์๋์ผ๋ก else ๋ฐํ์ ์ถ๊ฐํ๋๋ก ํ ์ ์์ต๋๋ค.
์ปจํ ์คํธ ์ถ๊ฐ, ๋ณ์์ ๋ก์ปฌ ์ด๋ฆ ์ง์ . ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ return์ด ๋ช ์์ ์ผ๋ก ๋ฉ๋๋ค.
f := os.Open("foo.txt") else err {
return errors.Wrap(err, "some context")
}
์ฌ๋ฌ ๋ฐํ ๊ฐ์ด ์๋ ์ปจํ ์คํธ ์ถ๊ฐ
f := os.Open("foo.txt") else err {
return i, j, errors.Wrap(err, "some context")
}
์ค์ฒฉ ํจ์๋ ์ธ๋ถ ํจ์๊ฐ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ผํ ์์๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ต์ข
์ค๋ฅ๋ฅผ ๋บ ๊ฒ์
๋๋ค.
bits := ioutil.ReadAll(os.Open("foo")) else err {
// either error ends up here.
return i, j, errors.Wrap(err, "some context")
}
์ปดํ์ผ๋ฌ๊ฐ ํจ์์ ์ค๋ฅ ๋ฐํ ๊ฐ ๋๋ฝ์ผ๋ก ์ธํด ์ปดํ์ผ์ ๊ฑฐ๋ถํฉ๋๋ค.
func foo(s string) int {
i := strconv.Atoi(s) // cannot implicitly return error due to missing error return value for foo.
return i * 2
}
์ค๋ฅ๊ฐ ๋ช ์์ ์ผ๋ก ๋ฌด์๋๊ธฐ ๋๋ฌธ์ ํ๋ณตํ๊ฒ ์ปดํ์ผ๋ฉ๋๋ค.
func foo(s string) int {
i, _ := strconv.Atoi(s)
return i * 2
}
์ปดํ์ผ๋ฌ๋ ํ๋ณตํฉ๋๋ค. ํ ๋น ๋๋ ์ ๋ฏธ์ฌ๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ฌ์ ๊ฐ์ด ์ค๋ฅ๋ฅผ ๋ฌด์ํฉ๋๋ค.
func foo() error {
return errors.New("whoops")
}
func bar() {
foo()
}
๋ฃจํ ๋ด์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
for _, s := range []string{"1","2","3","4","5","6"} {
i := strconv.Atoi(s) else continue
}
ํธ์ง: ;
๋ฅผ else
๋ก ๋์ฒดํ์ต๋๋ค.
@savaki ๋๋ ๋น์ ์ ์๋ ์๊ฒฌ์ ์ดํดํ๋ค๊ณ ์๊ฐํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ Go์ ์์ด๋์ด๋ฅผ ์ข์ํ์ง๋ง ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ตฌ๋ฌธ ๋ณ๊ฒฝ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ฌ ์ ์๊ณผ ๋๋ผ์ธ ์ ๋๋ก ์ ์ฌํด์ง๋๋ค.
๋น์ ์ด ์ ์ํ ๊ฒ์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ํ์ฌ if err != nil {return err}
๋๋ ์ด ์ ์์์ ์๊ฐ๋ try ํจ์์ ๋ฌ๋ฆฌ ํจ์๊ฐ ๋ฐํํ ์ ์๋ ๋ชจ๋ ์ง์ ์ ๋
ธ์ถํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์ ํํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง ์๊ฐ์ ์ผ๋ก ์ฝ๋๋ ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋ณด์ผ ๊ฒ์
๋๋ค. ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ด๋ค ํจ์ ํธ์ถ์ด ์ค๋ฅ๋ฅผ ๋ฐํํ ์ง ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ธ IMO๋ณด๋ค ๋ ๋์ ๊ฒฝํ์ด ๋ ๊ฒ์
๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋ ํจ์์ ๋ํด ์๋ฏธ๋ก ์ ๊ท์น์ ๊ฐ์ ํ๋ ๊ฒฝ์ฐ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์์ ์ผ๋ก ๋ง๋ค์ด์ง ์ ์์ต๋๋ค. ํน์ ๋ฌธ๊ตฌ๋ ๋ฌธ์๋ก ์์ํ๊ฑฐ๋ ๋๋์ผ ํ๋ ๊ฒ์ฒ๋ผ. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๋ฐํ ์ง์ ์ด ๋งค์ฐ ๋ช ํํด์ง๋ฉฐ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ์ง๋ง ๋ฌด์๋๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ ๋ ๋ก๋๋ฅผ ์ธ์น๋ ๋ฆฐํธ ๊ฒ์ฌ๊ฐ ์ด๋ฏธ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ผ๋ง๋ ๋ ๋์์ง ํ์ ํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ํน์ ๋ฐฉ์์ผ๋ก ํจ์์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ๋จ์ ์ ์ค๋ฅ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ฏ๋ก API๊ฐ ๋ ์๋ป์ง ์ ์๋ค๋ ์ ์ ๋๋ค(๊ทธ๋ฌ๋ ์ด ์ฃผ์ ์ ๋ํ FAQ ์ฐธ์กฐ). ์ฐ๋ฆฌ๋ ์ด ์คํ์ผ์ด ํ๋ฆฝ๋๋ฉด ์ต์ํด์ง ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
์ด์ ๊ฐ์ ๊ฒ์ด ์ด์ ์ ์ ์๋์๋์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ ์ฌ๊ธฐ ๋๋ ์ ์์์์ ์ฐพ์ ์ ์์ต๋๋ค. ํ์ฌ ํจ์์ ์ค๋ฅ ๋ฐํ ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ ๋ค๋ฅธ ๋ด์ฅ ํจ์๋ฅผ ๊ณ ๋ คํ ์ ์ด ์์ต๋๊น?
์:
func example() error {
var err *error = funcerror() // always return a non-nil pointer
fmt.Print(*err) // always nil if the return parameters are not named and not in a defer
defer func() {
err := funcerror()
fmt.Print(*err) // "x"
}
return errors.New("x")
}
func exampleNamed() (err error) {
funcErr := funcerror()
fmt.Print(*funcErr) // "nil"
err = errors.New("x")
fmt.Print(*funcErr) // "x", named return parameter is reflected even before return is called
*funcErr = errors.New("y")
fmt.Print(err) // "y", unfortunate side effect?
defer func() {
funcErr := funcerror()
fmt.Print(*funcErr) // "z"
fmt.Print(err) // "z"
}
return errors.New("z")
}
์๋ ์ฌ์ฉ:
func CopyFile(src, dst string) (error) {
defer func() {
err := funcerror()
if *err != nil {
*err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}()
// one liner alternative
// defer fmt.HandleErrorf(funcerror(), "copy %s %s", src, dst)
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
defer func() {
w.Close()
err := funcerror()
if *err != nil {
os.Remove(dst) // only if a โtryโ fails
}
}()
try(io.Copy(w, r))
try(w.Close())
return nil
}
๋๋ funcerror(์ด๋ฆ์ ์งํ ์ค์ธ ์์ ์ ๋๋ค. D )๋ defer ๋ด๋ถ์์ ํธ์ถ๋์ง ์์ผ๋ฉด nil์ ๋ฐํํ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋์์ funcerror๊ฐ "Errorer" ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํ์ฌ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.
type interface Errorer() {
Error() error
}
@savaki ์ ๋ try()
๋ฅผ ์๋ตํ๊ณ ์ง๋ ๋๋ ์ ํ ์ฃผ์ฅ์ ํ
์คํธํ๋ ๊ฒ๊ณผ ๊ฐ๋๋ก ํ์ฉํ๋ ๊ทํ์ ์ ์์ ์ค์ ๋ก ์ข์ํฉ๋๋ค. ํจ์ฌ ๋ _"๊ฐ๋ ๊ฒ ๊ฐ์์."_
๊ทธ๋ฌ๋ ์ฌ์ ํ ๋์ ๋๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ค๋ฅ๊ฐ return
๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ ๊ธฐ๋ฅ์ ์ข
๋ฃํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ทํ์ ์ ์์
๋๋ค. ๊ณ ๋ คํ์ง ์์ ๊ฒ์ ํ์ฌ for
์ค break
$#$ ๋๋ ํ์ฌ for
์ ๋ํด continue
๋ฅผ ๋ฐํํ๋ ๊ฒ์
๋๋ค.
์ด๊ธฐ return
s๋ ์ฌ๋ฌ ๋ฒ ๋ฉ์ค๊ฐ ๋ ๋์ ์ ํ์ผ ๋ ํฐ ๋ง์น์
๋๋ค.
๊ทธ๋์ ์ ๋ break
๋ฐ continue
๊ฐ ์ ํจํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ๋ต์ผ๋ก ํ์ฉ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ฉฐ ํ์ฌ ๊ทํ์ ์ ์์ return
๋ง ๊ฐ์ ํ๋ ๋ฐ๋ฉด try()
๋ ์ด๋ฅผ ๊ฐ์ ํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ํธ์ถํฉ๋๋ค ํธ๋ค๋ฌ ์์ฒด๋ return
๋ง ๊ฐ๋ฅํ๊ณ break
๋๋ continue
$ ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
savaki์ ๋น์ทํ ์์ด๋์ด๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ธ๋ก ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋จ๋ฝ ๋ฑ์ ์ํ๋ ๋ฃจํ์ ๋ํ ์ปจํ ์คํธ ์ถ๊ฐ
@mikeschinkel ๋ด ํ์ฅ ๊ธฐ๋ฅ์ ์ฐธ์กฐํ์ญ์์ค. ๊ทธ์ ์ ๋ ๋น์ทํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ๋ฐฉ๊ธ ์ ํ์ ๋ธ๋ก ๋ฌธ์ผ๋ก ํ์ฅํ์ต๋๋ค.
@์ ์์ค ๋ก๋ ์ค
@mikeskkinkel ๋ด ํ์ฅ ๊ธฐ๋ฅ์ ์ฐธ์กฐํ์ญ์์ค. ๊ทธ์ ๋๋ ๋น์ทํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ๋ฐฉ๊ธ ์ ํ์ ๋ธ๋ก ๋ฌธ์ผ๋ก ํ์ฅํ์ต๋๋ค.
๊ทํ์ ์๋ฅผ ๋ค๋ฉด:
f := os.Open("foo.txt"); err {
return errors.Wrap(err, "some context")
}
์ค๋๋ ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ๊ณผ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
f,err := os.Open("foo.txt");
if err != nil {
return errors.Wrap(err, "some context")
}
ํ์คํ ๋์๊ฒ ๋ฐ๋์งํฉ๋๋ค. ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ :
err
์(๋) _"๋ง๋ฒ์ฒ๋ผ"_ ์ ์ธ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ง๋ฒ์ ์ต์ํํด์ผ๊ฒ ์ฃ ? ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํด ๋ณด๊ฒ ์ต๋๋ค.f, err := os.Open("foo.txt"); err {
return errors.Wrap(err, "some context")
}
nil
๊ฐ์ false
๋ก ํด์ํ์ง ์๊ณ ํฌ์ธํฐ ๊ฐ์ true
๋ก ํด์ํ์ง ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.f, err := os.Open("foo.txt"); err != nil {
return errors.Wrap(err, "some context")
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์๋ํ๋ ๊ฒ์ ํ ์ค์ ๋ง์ ์์ ๊ณผ ๋ง์ ๊ตฌ๋ฌธ์ด ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ธฐ ์์ํ๋ฏ๋ก ๋ช ํ์ฑ์ ์ํด ์ด์ ๋ฐฉ์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Go๊ฐ ๋(2) ๊ฐ์ ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? iserror()
๋ฐ error()
? ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๋์์ง ์์ต๋๋ค.
f := os.Open("foo.txt"); iserror() {
return errors.Wrap(error(), "some context")
}
๋๋ ๋ ๋์ _(๊ฐ์ ๊ฒ):_
f := os.Open("foo.txt"); iserror() {
return error().Extend("some context")
}
๋น์ ๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๋ป๊ฒ ์๊ฐํฉ๋๊น?
์ ์ณ๋๊ณ , ๋ด ์ฌ์ฉ์ ์ด๋ฆ ์ฒ ์๋ฅผ ํ์ธํ์ญ์์ค. ๋ด๊ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์๋ค๋ฉด ๋น์ ์ ์ธ๊ธ์ ์๋ฆฌ์ง ์์์ ๊ฒ์ ๋๋ค ...
@mikeschinkel ๋ด ์ ํ์ ์๋ ์ด๋ฆ์ ๋ํด ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํ๊ณ github๊ฐ ์๋ ์ ์ํ์ง ์์์ต๋๋ค.
err์ "๋ง๋ฒ์ฒ๋ผ" ์ ์ธ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ง๋ฒ์ ์ต์ํํด์ผ๊ฒ ์ฃ ? ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์, ๋ฐํ์ ์๋์ผ๋ก ์ฝ์ ํ๋ ์ ์ฒด ์์ด๋์ด๋ ๋ง๋ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ์ด ์ ์ฒด ์ ์์์ ์งํ๋๋ ๊ฐ์ฅ ๋ง๋ฒ ๊ฐ์ ์ผ์ด ์๋๋๋ค. ๋ํ ์ค๋ฅ๊ฐ ์ ์ธ๋์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋ฒ์๊ฐ ์ง์ ๋ ๋ธ๋ก์ ์ปจํ ์คํธ ๋ด๋ถ์ ๋์์ ๋ถ๋ชจ ๋ฒ์๋ฅผ ์ค์ผ์ํค๋ ๊ฒ์ ๋ฐฉ์งํ๋ฉด์ ์ผ๋ฐ์ ์ผ๋ก if ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์๋ ๋ชจ๋ ์ข์ ๊ฒ์ ์ ์งํฉ๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ํจํค์ง์ ๊ณง ์ถ๊ฐ๋ go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค. ๋๋ ์ด ์ ์์์ ์ด๋ค ๊ฒ๋ ๋งค์ฐ ์ ์ฉํ๋ค๊ณ ๋ณด์ง ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ํ ์ค๋น๊ฐ๋์ด ์์ง ์๋ค๋ฉด golang์ ๊ฐ์ฅ ์์ฐ์ค๋ฌ์ด ์ ํฉ์ฑ์ ์ ๊ณตํ๋ ค๊ณ ์๋ํ๊ณ ์์ต๋๋ค.
_"๋ฐํ์ ์๋์ผ๋ก ์ฝ์ ํ๋ ์์ด๋์ด๋ ๋ง๋ฒ๊ณผ ๊ฐ์ต๋๋ค."_
๋น์ ์ ๊ฑฐ๊ธฐ์์ ๋์๊ฒ์ ์ด๋ค ๋ ผ์๋ ์ป์ง ๋ชปํ ๊ฒ์ ๋๋ค.
_"์ด๊ฒ์ ์ด ์ ์ฒด ์ ์์์ ์งํ๋๋ ๊ฐ์ฅ ๋ง๋ฒ ๊ฐ์ ์ผ์ด ์๋๋๋ค."_
๋๋ _"๋ชจ๋ ๋ง๋ฒ์ ๋ฌธ์ ๊ฐ ์๋ค"๋ผ๊ณ ์ฃผ์ฅํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ๋ค.
_"๊ฒ๋ค๊ฐ ์ค๋ฅ๊ฐ ์ ์ธ๋์๋ค๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ๋ฒ์๊ฐ ์ง์ ๋ ๋ธ๋ก์ ์ปจํ ์คํธ ๋ด๋ถ์์ ๋ง์ง๋ง์..."_
๊ทธ๋์ err2
๋ผ๊ณ ๋ถ๋ฅด๊ณ ์ถ๋ค๋ฉด ์ด๊ฒ๋ ์๋ํ ๊น์?
f := os.Open("foo.txt"); err2 {
return errors.Wrap(err, "some context")
}
๋ฐ๋ผ์ ์ธ๋ฏธ์ฝ๋ก ๋ค์ err
/ err2
์ ํน๋ณํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฆ, nil
๋๋ nil
์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค. ์ง๋๋ฅผ ํ์ธํ ๋์ ๊ฐ์ด bool
nil
?
if _,ok := m[a]; !ok {
print("there is no 'a' in 'm'")
}
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ํจํค์ง์ ๊ณง ์ถ๊ฐ๋ go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค.
์ ๋ break
๋ฐ continue
_( return
๋ ์๋)_ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ง์กฑํฉ๋๋ค.
์๋ ๊ทธ๋๋ก, ๋๋ ์ด try()
์ ์์ด ๋์์ด ๋๊ธฐ๋ณด๋ค๋ ํด๋กญ๋ค๊ณ ์๊ฐํ๋ฉฐ, ์ ์๋ ๋๋ก ๊ตฌํํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ๋ณด๊ณ ์ถ์ง ์์ต๋๋ค. #jmtcw.
@beoran @mikeschinkel ์ด์ ์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ฌ ์ด ๋ฒ์ ์ try
๋ฅผ ๊ตฌํํ ์ ์๋ค๊ณ ์ ์ํ๋๋ฐ, ์ด๋ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ๊ณ ์๋ค๋ฉด, ๋น์ ์ ๋ ๋ค panic
๋ฅผ ํธ์ถํ๋๋ก ํ์ฌ try
๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ try
์ ์ด ๋ฒ์ ์ ๋งค์ฐ ๋ช
์์ ์ผ๋ก panic
ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฒ์ ์ try
๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์, ์ ๋ค๋ฆญ(https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md์ ๋์์ธ ์ด์๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋ ฅํ ์ ๋ค๋ฆญ ๋ฒ์ )์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํจ๋์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ์ ๋ํ ํจ๋์ ์ค๋๋ Go ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ํ์ด ์๋๋ฉฐ ๋์๊ฒ ์ข์ ์๊ฐ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
@mikeschinkel ํน์ ์ฒ๋ฆฌ๋ ๋ธ๋ก์ด ์ค๋ฅ๊ฐ ์์ ๋๋ง ์คํ๋๋ ๊ฒ์
๋๋ค.
```
f := os.Open('foo'); err { return err } // ์ฌ๊ธฐ์ err์ ํญ์ nil์ด ์๋๋๋ค.
@ianlancetaylor
_"์, ์ฐ๋ฆฌ๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค... ๊ทธ๋ฌ๋ ์ค๋ฅ์ ํจ๋ํ๋ ๊ฒ์ ์ค๋๋ Go ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ํ์ด ์๋๋ฉฐ ๋์๊ฒ ์ข์ ์๊ฐ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค."_
๋๋ ์ค์ ๋ก ์ด๊ฒ์ ๋ํด ๋น์ ์ ์๊ฒฌ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋น์ ์ด ๋ด ์๊ฒฌ์ ์๋๋ฅผ ์๋ชป ํด์ํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. Go ํ์ด panic()
๋ฅผ ์ฌ์ฉํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ผ๊ณ ์ ์ํ ๊ฒ์ ์๋๋๋ค. ๋ฌผ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค.
๋์ ์ ๋๋ ์ค์ ๋ก ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํ ๋ง์ ๊ณผ๊ฑฐ ์๊ฒฌ์์ ๊ทํ์ ๋ฆฌ๋๋ฅผ ๋ฐ๋ฅด๋ ค๊ณ ๋
ธ๋ ฅ ํ์ผ๋ฉฐ, ์ฌ์ฉ์ ์์ญ์์ ๋์ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ๋์ ์ผ๋ก ํ์ํ์ง ์์ Go ๋ณ๊ฒฝ์ ํผํ๋๋ก ์ ์ํ์ต๋๋ค. ๋ฐ๋ผ์ _if_ ์ ๋ค๋ฆญ์ด ํด๊ฒฐ๋ _๊ทธ๋_ try()
๋ฅผ ์ํ๋ ์ฌ๋๋ค์ panic()
๋ฅผ ํ์ฉํ๋๋ผ๋ ์ค์ ๋ก ์ค์ค๋ก ๊ตฌํํ ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํ์ด Go๋ฅผ ์ํด ์ถ๊ฐํ๊ณ ๋ฌธ์ํํด์ผ ํ ๊ธฐ๋ฅ์ด ํ๋ ์ค์ด๋ค ๊ฒ์
๋๋ค.
๋ด๊ฐ ํ๊ณ ์์ง ์์ ๊ฒ(์๋ง๋ ๋ช
ํํ์ง ์์์ ์๋ ์์)์ ์ฌ๋๋ค์ด ์ค์ ๋ก $# try()
panic()
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์นํธํ๋ ๊ฒ์ด์์ต๋๋ค. ๋จ์ง ๊ทธ๋ค์ด ์ ๋ง๋ก ์ํ๊ธฐ๋ง ํ๋ฉด ํ ์ ์๊ณ ์ ๋ค๋ฆญ.
๊ทธ๊ฒ ๋ช ํํด ์ก๋์?
๋์๊ฒ panic
์ ํธ์ถํ๋ ๊ฒ์ ์๋ฃ๋์์ง๋ง try
์ ๋ํ ์ด ์ ์๊ณผ ์๋นํ ๋ค๋ฆ
๋๋ค. ๊ทธ๋์ ๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ดํดํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฒ๋ค์ด ๋๋ฑํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ํจ๋์ ์ผ์ผํค๋ try
๋ฒ์ ์ ๊ตฌํํ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ๋ ฅํ ์ ๋ค๋ฆญ์ด ์๋๋ผ๋ ์ด ์ ์์ ์ ์๋ try
๋ฒ์ ์ ๋ํ ํฉ๋ฆฌ์ ์ธ ์๊ตฌ๊ฐ ์ฌ์ ํ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@ianlancetaylor ์ธ์ ํฉ๋๋ค. ๋ค์, ๋๋ try()
๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ๋ณด๋ค ์ถ๊ฐํ ํ์๊ฐ ์๋ ์ด์ ๋ฅผ ์ฐพ๊ณ ์์์ต๋๋ค. ์์์ ๋งํ๋ฏ์ด ์ฌ๊ธฐ์ ์ ์๋ ๋๋ก try()
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ์๋ก์ด ๊ฒ์ด ์๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์์ ํ ์๊ฐ์ ์ธ ์ธก๋ฉด์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๊ธฐ check
์ ์์ ์ด๊ฒ๋ณด๋ค ๋ ์ข์ํ์ต๋๋ค. check
๋ try()
์ ๊ฐ์ ํ์ ๊ฐ์ง๊ณ ์์ง๋ง $#$ bar(try(foo()))
bar(check foo())
๊ฐ ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
๋ ์ค์ํ ๊ฒ์ handle
/ check
์ ๋ํ ๋์ ์ฃผ๋ ๋ถ๋ง์ ๊ฐ๋ณ ์ํ๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ํํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค -- ๊ทธ๋ฆฌ๊ณ ์ด์ ์ด try()
์ ์์๋ ๋์ผํ ๊ฒฐํจ์ด ์์ต๋๋ค. ์ง์ฐ ๋ฐ ๋ช
๋ช
๋ ๋ฐํ์ ๊น๋ค๋ก์ด ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋ ์ด๋ณด์ ํผ๋ ๊ธฐ๋ฅ์ ํธ์ถํ๋ ๋์. ๊ทธ๋ฆฌ๊ณ handle
์์๋ ๋ฒ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ค ๋ธ๋ก์ ์ ์ํ ์ ์๋ ์ต์
์ด ์์์ต๋๋ค. defer
์์๋ ๊ทธ๊ฒ๋ ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
๋ด๊ฐ ์๋ ํ, ์ด ์ ์์ ๋ชจ๋ ๋ฉด์์ ์ด์ ์ handle
/ check
์ ์์ ์ก์ต๋๋ค.
๋ค์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ง์ฐ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค.
try
๋ ๊ธฐ๋ฅ์์ ์ ์ด/์๋๋ ์ข
๋ฃ์
๋๋ค. ์ ์ด๋์ง ์๊ฑฐ๋ ์๋ํ์ง ์์ ๊ธฐ๋ฅ ์ข
๋ฃ๋ฅผ ํฌํจํ์ฌ ํญ์ ์คํ์ ์ฐ๊ธฐํฉ๋๋ค. ๊ทธ ๋ถ์ผ์น๋ ํผ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋ค์์ ๊ฐ์ ์๋๋ฆฌ์ค์
๋๋ค.
func someHTTPHandlerGuts() (err error) {
defer func() {
recordMetric("db call failed")
return fmt.HandleErrorf("db unavailable: %v", err)
}()
data := try(makeDBCall)
// some code that panics due to a bug
return nil
}
net/http๊ฐ ํจ๋์์ ๋ณต๊ตฌ๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ํจ๋๊ณผ ๊ด๋ จ๋ ํ๋ก๋์
๋ฌธ์ ๋๋ฒ๊น
์ ์์ํด ๋ณด์ญ์์ค. ๊ณ์ธก์ ๋ณด๋ฉด recordMetric
ํธ์ถ์์ db ํธ์ถ ์คํจ๊ฐ ๊ธ์ฆํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํ์ ๋ผ์ธ์ ํจ๋์ธ ์ง์ ํ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฆด ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ค์ ๋ก ์ผ๋ง๋ ์ฌ๊ฐํ ๋ฌธ์ ์ธ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง (์ฌํ๊ฒ๋) defer๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ด์์ ์ธ ๋ฉ์ปค๋์ฆ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ ๋ ๋ค๋ฅธ ์ด์ ์ผ ์ ์์ต๋๋ค.
๋ค์์ ์ ๊ธฐ๋ ์ฐ๋ ค ์ฌํญ ์ค ์ผ๋ถ์ ๋์์ด ๋ ์ ์๋ ์์ ์ฌํญ์
๋๋ค. $#$ return
$#$ ๋์ try
๋ฅผ goto
์ฒ๋ผ ์ทจ๊ธํ์ญ์์ค. ๋ด ๋ง์ ๋ค์ด. :)
try
๋ ๋์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ ์คํ์ด ๋ฉ๋๋ค.
t1, โฆ tn, te := f() // t1, โฆ tn, te are local (invisible) temporaries
if te != nil {
err = te // assign te to the error result parameter
goto error // goto "error" label
}
x1, โฆ xn = t1, โฆ tn // assignment only if there was no error
ํํ:
defer
๋ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๋ฐ ํ์ํ์ง ์์ต๋๋ค. (๊ทธ๋ฌ๋ ๋ช
๋ช
๋ ๋ฐํ์ ์ฌ์ ํ โโํ์ํฉ๋๋ค.)error:
๋ ์ด๋ธ์ด ์๋ค๋ ๊ฒ์ ํจ์ ์ด๋๊ฐ์ try
๊ฐ ์๋ค๋ ์๊ฐ์ ๋จ์์
๋๋ค.์ด๊ฒ์ ๋ํ ๊ธฐ๋ฅ์ผ๋ก์์ ํธ๋ค๋ฌ ๋ฌธ์ ๋ฅผ ํํผํ๋ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๋ ์ด๋ธ์ ํธ๋ค๋ฌ๋ก ์ฌ์ฉํ์ญ์์ค. try(fn(), wrap)
๋ goto wrap
goto error
์
๋๋ค. ์ปดํ์ผ๋ฌ๋ wrap:
๊ฐ ํจ์์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ํธ๋ค๋ฌ๊ฐ ์์ผ๋ฉด ๋๋ฒ๊น
์๋ ๋์์ด ๋ฉ๋๋ค. ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐ/๋ณ๊ฒฝํ์ฌ ๋๋ฒ๊น
๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ํ ์ฝ๋:
func CopyFile(src, dst string) (err error) {
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a โtryโ fails
}
}()
try(io.Copy(w, r), copyfail)
try(w.Close())
return nil
error:
return fmt.Errorf("copy %s %s: %v", src, dst, err)
copyfail:
recordMetric("copy failure") // count incidents of this failure
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
๊ธฐํ ์๊ฒฌ:
try
์ ๋์์ผ๋ก ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ ์ด๋ธ ์์ ์ข
๋ฃ ๋ช
๋ น๋ฌธ์ด ์์ผ ํ ์ ์์ต๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ ํจ์๋ฅผ ๊ฐ์ ์ข
๋ฃํ๊ณ ์ผ๋ถ ์คํ๊ฒํฐ ์ฝ๋๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ํฉ๋ฆฌ์ ์ด๊ณ ์ ์ฉํ ์ฌ์ฉ์ ๋ฐฉํดํ ์ ์์ต๋๋ค.try
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๊ฒ '์ํ๋ฉด ํ์ง๋ง'๋ผ๋ ๊ธฐ์น์ ํด๋นํ๋ ๊ฒ ๊ฐ์๋ฐ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.ํฌ๋ ๋ง: ์ด ์์ด๋์ด์ ๋ณํ์ ์๋ GopherCon์์ @griesemer ๊ฐ ์ง์ ์ ์ํ ๊ฒ์ ๋๋ค.
@josharian ์ฌ๊ธฐ์ panic
์์ ์ํธ ์์ฉ์ ๋ํด ์๊ฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ๊ทธ๊ฒ์ ๊บผ๋ด์ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ์๋ ๋์๊ฒ ์ด์ํ๊ฒ ๋ณด์
๋๋ค. ๋ค์ ์ฝ๋์์ defer๊ฐ ํญ์ "db call failed"
๋ฉํธ๋ฆญ์ ๊ธฐ๋กํ๋ค๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. someHTTPHandlerGuts
๊ฐ ์ฑ๊ณตํ๊ณ nil
๋ฅผ ๋ฐํํ๋ฉด ์๋ชป๋ ๋ฉํธ๋ฆญ์ด ๋ฉ๋๋ค. defer
๋ ์ค๋ฅ๋ ํจ๋์ ๊ฒฝ์ฐ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ข
๋ฃ ๊ฒฝ์ฐ์ ์คํ๋๋ฏ๋ก ํจ๋์ด ์์ด๋ ์ฝ๋๊ฐ ์๋ชป๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
func someHTTPHandlerGuts() (err error) {
defer func() {
recordMetric("db call failed")
return fmt.HandleErrorf("db unavailable: %v", err)
}()
data := try(makeDBCall)
// some code that panics due to a bug
return nil
}
@josharian ์, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๋
์ ๋
ผ์ํ ๋ฒ์ ๊ณผ ๊ฑฐ์ ๋น์ทํฉ๋๋ค(๋จ, try
check
์ ์ฌ์ฉํ๋ค๋ ์ ๋ง ์ ์ธ). error
๋ ์ด๋ธ์ ๋๋ฌํ๋ฉด ๋๋จธ์ง ํจ์ ๋ณธ๋ฌธ์ผ๋ก "๋ค๋ก" ์ ํํ ์ ์๋ค๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด goto
๊ฐ ๋ค์ "๊ตฌ์กฐํ"๋ฉ๋๋ค(์คํ๊ฒํฐ ์ฝ๋๋ ๋ถ๊ฐ๋ฅ). ์ ๊ธฐ๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ( error:
) ๋ ์ด๋ธ์ด ํญ์ ํจ์์ ๋์์ ๋๋ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค(๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ๋ ์ด ๋ ์ด๋ธ์ ๊ฑด๋๋ฐ์ด์ผ ํจ). ๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ (๋์) ๋ฐฉํด๊ฐ ๋์ง ์๋ ๊ฒ์ ์ข์ํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฒ์๋ถํฐ ๋ฐ๋ก ๋ณด์ฌ์ผ ํ๋ค๊ณ ๋๊ผ์ต๋๋ค.
@mikeshenkel ๋ฃจํ์์ ๋์์ค๋ ๊ฒ์ ์์๊ฐ ์๋ ํ๋ฌ์ค๋ก ๋ด ๋๋ค. ๋ด ์๊ฐ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฃจํ์ ๋ด์ฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ณ๋์ ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํ์ฌ์ ๊ฐ์ด ๋ช ์์ ์ผ๋ก err์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ ๊ฒ์ ๋๋ค. ์ด ๋ ๊ฐ์ง ๋ชจ๋ ๋์๊ฒ ์ข์ ๊ฒฐ๊ณผ๋ก ๋ณด์ ๋๋ค.
๋ด POV์์ ์ด ์๋ ๊ตฌ๋ฌธ์ด ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
V, ํ์ธ:= m[ํค]
์ง๋์์ ์ฝ์ ์์
handle
/ check
์ ์ ์ ๋จ์ํ๋ ํํ๋ก ๋์ด๋ฆฌ๋ฉด goto ๋ ์ด๋ธ์ด ํธ๋ค๋ฌ๋ฅผ ํจ์์ ๋์ผ๋ก ๊ฐ์ ํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค. handle err { ... }
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ง ํธ๋ค๋ฌ๊ฐ ์ฐ๊ฒฐ๋๋๋ก ํ์ง ์๊ณ ๋์ ๋ง์ง๋ง ํ๋๋ง ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ ์์ ๋ง์ด ๋จ์ํํ๊ณ ์ฌ์ฉ ์ง์ ์ ๋ ๊ฐ๊น๊ฒ ์ฒ๋ฆฌํ๋ค๋ ์ ์ ์ ์ธํ๊ณ goto ์์ด๋์ด์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
func CopyFile(src, dst string) (err error) {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a โcheckโ fails
}
}()
{
// handlers are scoped, after this scope the original handle is used again.
// as an alternative, we could have repeated the first handle after the io.Copy,
// or come up with a syntax to name the handlers, though that's often not useful.
handle err {
recordMetric("copy failure") // count incidents of this failure
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
check io.Copy(w, r)
}
check w.Close()
return nil
}
๋ณด๋์ค๋ก ์ด๊ฒ์ ๋ชจ๋ ๊ธฐ์กด ์ฌ์ฉ์ ๋ฐํ์ด ์๊ธฐ ๋๋ฌธ์ ํธ๋ค๋ฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฏธ๋์ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค.
@josharian @griesemer ๋ช
๋ช
๋ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋์
ํ๋ฉด(ํ์ธ/์ฒ๋ฆฌ์ ๋ํ ๋ง์ ์๋ต์ด ์์ฒญ๋จ, ๋ฐ๋ณต๋๋ ํ
๋ง ์ฐธ์กฐ) try(f(), err)
๋ณด๋ค ์ ํธ๋๋ ๊ตฌ๋ฌธ ์ต์
์ด ์์ต๋๋ค.
try.err f()
try?err f()
try#err f()
?err f() // because 'try' is redundant
?return f() // no handler
?panic f() // no handler
(?err f()).method()
f?err() // lead with function name, instead of error handling
f?err().method()
file, ?err := os.Open(...) // many check/handle responses also requested this style
Go์์ ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ ์ค ํ๋๋ ๊ตฌ๋ฌธ์ด ๋น๊ต์ ๊ตฌ๋์ ์ด ์๊ณ ํฐ ๋ฌธ์ ์์ด ํฐ ์๋ฆฌ๋ก ์ฝ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. Go๊ฐ $#@!perl
๋ก ๋๋๋ ๊ฒ์ ์ ๋ง ์ซ์ดํฉ๋๋ค.
๋์๊ฒ ๋ด์ฅ ๊ธฐ๋ฅ์ "์๋"ํ๊ณ ์ฒด์ธ์ ํ์ฑํํ๋ ๋ฐ๋ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋๋ ๊ดํธ ์์ด ์ง์ ํ๋ ๊ฒ์ ์ ํธํ๋ค. ์ ์์์ ์๋ ์ฌ๋ฌ ์ค์ด ํ์ํ์ง๋ง ๋ ์ฝ๊ธฐ ์ฌ์์ง๋๋ค(์ฆ, ๊ฐ๋ณ "์๋" ์ธ์คํด์ค๋ ๋์น๊ธฐ ๋ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค). ์, ์ธ๋ถ ํ์๋ฅผ ์ค๋จํ์ง๋ง ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์ผํญ ์ฐ์ฐ์๋ go์ ๋ฌด์ธ๊ฐ๊ฐ ์๊ณ ๋ ๋ง์ ํค ์ ๋ ฅ์ด ํ์ํ์ง๋ง ๋์์ ๊ฐ๋ ์ฑ/์ ์ง ๋ณด์์ฑ์ ํฅ์์ํค๋ ๋ ๋ค๋ฅธ ์์น์ ๋๋ค. ์ด ๋ณด๋ค ์ ํ๋ ํ์์ "์๋"๋ฅผ ์ถ๊ฐํ๋ฉด ํํ๋ ฅ๊ณผ ๊ฐ๋ ์ฑ ์ฌ์ด์ ๊ท ํ์ด ๋ ์ ๋ง์ ๊ฒ์ ๋๋ค(IMO).
FWIW, panic
๋ ์ ์ด ํ๋ฆ์ ์ํฅ์ ๋ฏธ์น๊ณ ๊ดํธ๊ฐ ์์ง๋ง go
๋ฐ defer
๋ ํ๋ฆ์ ์ํฅ์ ๋ฏธ์น๊ณ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋๋ try
๊ฐ ํน์ดํ ํ๋ฆ ์ฐ์ฐ์ด๋ผ๋ ์ ์์ defer
์ ๋ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค try (try os.Open(file)).Read(buf)
์ด์จ๋ , ํ์ง๋ง ์ด์จ๋ . ์ด๋ ์ชฝ์ด๋ ๊ด์ฐฎ์ต๋๋ค.
๋ชจ๋ ์ฌ๋์ด ์ต์ข
์ค๋ฅ ๋ฐํ ๋ณ์์ ์์์ ์ด๋ฆ์ ์ซ์ดํ ๊ฒ์ด๋ผ๋ ์ ์: $err
. try()
IMO๋ณด๋ค ๋ซ์ต๋๋ค. :-)
@griesemer
_"๊ฐ์ธ์ ์ผ๋ก, ๋๋ ๋ฐฉํด๊ฐ ๋๋ ์๋ฌ ํธ๋ค๋ง ์ฝ๋๋ฅผ ์ข์ํ๋ค(๋ง์ง๋ง์)"_
๊ฑฐ๊ธฐ์ +1!
๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ _before_ ๊ตฌํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ _after_ ๊ตฌํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ณด๋ค ์ถ๋ก ํ๊ธฐ๊ฐ ํจ์ฌ ์ด๋ ต๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ ์ ์ ์ผ๋ก ์ ํํ๊ณ ๋ ผ๋ฆฌ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ์ผ ํ๋ ๊ฒ์ 1980๋ ์ Basic with GOTO๋ฅผ ์์ฑํ๋ ๋๋ก ๋์๊ฐ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
CopyFile()
๋ฅผ ์์ ๋ก ๋ค์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๋ค๋ฅธ ์ ์ฌ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ํ๊ฒ ์ต๋๋ค.
func CopyFile(src, dst string) (err error) {
r := os.Open(src)
defer r.Close()
w := os.Create(dst)
defer w.Close()
io.Copy(w, r)
w.Close()
for err := error {
switch err.Source() {
case w.Close:
os.Remove(dst) // only if a โtryโ fails
fallthrough
case os.Open, os.Create, io.Copy:
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
default:
err = fmt.Errorf("an unexpected error occurred")
}
}
return err
}
ํ์ํ ์ธ์ด ๋ณ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
for range{}
์ ์ ์ฌํ for error{}
๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ง๋ง ์ค๋ฅ ๋ฐ์ ์์๋ง ์
๋ ฅ๋๊ณ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
<object>.Error() string
๋ฅผ ๊ตฌํํ๋ ๋ฐํ ๊ฐ ์บก์ฒ๋ฅผ ์๋ต ํ ์ ์์ง๋ง for error{}
๊ตฌ๋ฌธ์ด ๋์ผํ func
๋ด์ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค.
func
๊ฐ ๋ง์ง๋ง ๋ฐํ ๊ฐ์์ _"์ค๋ฅ"_๋ฅผ ๋ฐํํ ๋ ํ๋ก๊ทธ๋จ ์ ์ด ํ๋ฆ์ด for error{}
๊ตฌ์กฐ์ ์ฒซ ๋ฒ์งธ ์ค๋ก ์ ํ ํ๋๋ก ํฉ๋๋ค.
_"์ค๋ฅ"_๋ฅผ ๋ฐํํ ๋ Go๋ <error>.Source()
๋ก ๊ฒ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ ๋นํฉ๋๋ค.
ํ์ฌ _"์ค๋ฅ"_๋ Error() string
๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ก ์ ์๋๋ฉฐ ๋ฌผ๋ก nil
๋ ์๋๋๋ค.
๊ทธ๋ฌ๋ RESTful API์ ์ฑ๊ณต ๊ฒฐ๊ณผ์ ํ์ํ ๊ฐ์ ๋ฐํํ ์ ์๋๋ก _์ฑ๊ณตํ ๊ฒฝ์ฐ์๋_ ์ค๋ฅ๋ฅผ ํ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ต๋๋ค. ๋ฐ๋ผ์ Go ํ์ err!=nil
๊ฐ _"์ค๋ฅ"๋ฅผ ์๋ฏธํ๋ค๊ณ ์๋์ผ๋ก ๊ฐ์ ํ์ง ๋ง๊ณ ๋์ ์ค๋ฅ ๊ฐ์ฒด๊ฐ IsError()
IsError()
๊ฐ true
๋ฅผ ๋ฐํํ๋์ง ํ์ธํ๋๋ก ์์ฒญํฉ๋๋ค. $ nil
๊ฐ ์๋ ๊ฐ์ด _"์ค๋ฅ"๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ์ ์ true
_( ํ์ฐ์ ์ผ๋ก ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋์ ๋ํด ๋งํ๋ ๊ฒ์ ์๋์ง๋ง ์ฃผ๋ก _"์ค๋ฅ"์์ ๋ถ๊ธฐํ๋๋ก ์ ์ด ํ๋ฆ์ ์ ํํ๋ ๊ฒฝ์ฐ์
๋๋ค. err!=nil
๋ง ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ์ด ๋งค์ฐ ์ ํ์ ์ผ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ ํจ์์ ๋ฐํ ๊ฐ ์ธก๋ฉด์์ ํ ์ ์์ต๋๋ค.)_
BTW, ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ๋ฐฉ์์ผ๋ก _"์ค๋ฅ"_ ํ
์คํธํ ์ ์๋๋ก ํ๋ ค๋ฉด ์๋ก์ด ๋ด์ฅ iserror()
ํจ์ ๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ์ฅ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
type ErrorIser interface {
IsError() bool
}
func iserror(err error) bool {
if err == nil {
return false
}
if _,ok := err.(ErrorIser); !ok {
return true
}
return err.IsError()
}
func
ํธ์ถ์์ ๋ง์ง๋ง _"error"_๋ฅผ ์บก์ฒํ์ง ์๋๋ก ํ์ฉํ๋ฉด ๋์ค์ ๋ฆฌํฉํ ๋ง์ด ์ฒ์์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ ํ์๊ฐ ์๋ func
์์ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํํ์ ์ค๋ฅ ๋ณต๊ตฌ๋ฅผ ์ฌ์ฉ ํ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์๊ณ ์ด ๋ฆฌํฉํ ๋ง์ ํ์ฉํ๊ณ func
๋ฅผ ํธ์ถํฉ๋๋ค.
๋์๊ฒ _"๊ฐ๋จํจ์ ํธ์ถํ๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ๋ฐํํด์ผ ํ๋์ ์๋๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฌ๊ธฐํด์ผ ํ๋์?"_๋ผ๋ ๊ฒฐ์ ์ Go ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋์ ๋๋ค. ์์ _"์ค๋ฅ"_๋ฅผ ์บก์ฒํ์ง ์๋๋ก ํ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์ ๊ฑฐ๋ฉ๋๋ค.
์ค์ ๋ก ์ด ์์ด๋์ด๋ฅผ Go ๋ฒ์ญ๊ธฐ๋ก ๊ตฌํํ๋ ค๊ณ ์๋ํ ๊ฒ์ ์ฝ ๋ฐ๋ ์ ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ Go ๊ธฐ๋ณธ ์ ๊ณต์ผ๋ก ์ถ๊ฐํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ๊ฐํ ์๊ฒฌ์ ์์ง๋ง ๊ฒฝํ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค(์ ์ฉํ์ง๋ ํ์คํ์ง ์์).
https://github.com/rhysd/trygo
ํ์ฅ๋ ์ธ์ด์ธ TryGo๋ฅผ ํธ์ถํ๊ณ TryGo to Go ๋ฒ์ญ๊ธฐ๋ฅผ ๊ตฌํํ์ต๋๋ค.
๋ฒ์ญ๊ธฐ์ ํจ๊ป ์ฝ๋
func CreateFileInSubdir(subdir, filename string, content []byte) error {
cwd := try(os.Getwd())
try(os.Mkdir(filepath.Join(cwd, subdir)))
p := filepath.Join(cwd, subdir, filename)
f := try(os.Create(p))
defer f.Close()
try(f.Write(content))
fmt.Println("Created:", p)
return nil
}
๋ก ๋ฒ์ญ๋ ์ ์์ต๋๋ค
func CreateFileInSubdir(subdir, filename string, content []byte) error {
cwd, _err0 := os.Getwd()
if _err0 != nil {
return _err0
}
if _err1 := os.Mkdir(filepath.Join(cwd, subdir)); _err1 != nil {
return _err1
}
p := filepath.Join(cwd, subdir, filename)
f, _err2 := os.Create(p)
if _err2 != nil {
return _err2
}
defer f.Close()
if _, _err3 := f.Write(content); _err3 != nil {
return _err3
}
fmt.Println("Created:", p)
return nil
}
์ธ์ด์ ์ ์ฝ ๋๋ฌธ์ ์ผ๋ฐ try()
ํธ์ถ์ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก ์ ํ๋ฉ๋๋ค.
ํ์ง๋ง ๋ด ์์ ํ๋ก์ ํธ๋ก ์ด๊ฒ์ ์๋ํ ์ ์์ต๋๋ค. ๋ด ๊ฒฝํ์
err
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ํจ์์ ๋ฐํ ๊ฐ์ ๋์
๊ณผ try()
ํน์ ํจ์ ๋ชจ๋์ ์ํด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋งค์ฐ ํผ๋์ค๋ฌ์ดtry()
ํจ์์๋ ์์์ ์ค๋ช
ํ '๋ํ ์ค๋ฅ' ๊ธฐ๋ฅ์ด ์์ต๋๋ค._"์ด ๋ ๊ฐ์ง ๋ชจ๋ ๋์๊ฒ ์ข์ ๊ฒฐ๊ณผ๋ก ๋ณด์ ๋๋ค."_
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋์ํ์ง ์๋ ๋ฐ ๋์ํด์ผ ํฉ๋๋ค.
_"์ด ์๋ ๊ตฌ๋ฌธ(๊ผญ ํ์ํ์ง ์์)์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค."_
๊ทธ ๋ฐ์ด ์๋ง๋ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ ์ด๋ ๋ฐ๋ ํ/์ปค๋ฎค๋ํฐ๊ฐ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์๋ ๊ณผ๊ฑฐ์ ๋ณํ์ โโ์ผ๋ง๋ ์ ํญํ๋์ง๋ฅผ ๊ฐ์ํ ๋.
์ฌ๊ธฐ์์ ์ ๋นํ๋ฅผ ํ์ฉํ๋ค๋ฉด ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ๋์๋ ๊ณผ๊ฑฐ ์ ์์ ๋ค์ ๊ฒํ ํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ด์ ์ฐ๋ฆฌ๋ ์ ํ๋ ์ฃ์ง ์ผ์ด์ค์๋ง ์ ์ฉํ Go์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๊น?
์ ์๊ฐ์๋ ์ด ์ ๋ก๋ฅผ ์ธ์ฐ๋ ๊ฒ์ด ์ฅ๊ธฐ์ ์ผ๋ก ์ข์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ง ๋ชปํ ๊ฒ์ ๋๋ค...
_"@mikeshenkel"_
์ถ์ : ๋ง์ถค๋ฒ ์ค๋ฅ๋ก ์ธํด ์ฒ์์ ๊ทํ์ ๋ฉ์์ง๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. _(์ด๊ฒ์ ๋๋ฅผ ํ๋๊ฒ ํ์ง ์์ต๋๋ค. ๋จ์ง ๋ด ์ฌ์ฉ์ ์ด๋ฆ์ ์ฒ ์๊ฐ ํ๋ ธ์ ๋ ์๋ฆผ์ ๋ฐ์ง ๋ชปํ ๋ฟ์ ๋๋ค...)_
try
๋ฅผ ํค์๋๊ฐ ์๋ ๋ด์ฅ์ผ๋ก ๋ง๋ค๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๋ํ ์ฝ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด ํ๋ฆ( panic
๋ฐ recover
๋ ๊ทนํ ๋๋ฌธ ๊ฒฝ์ฐ์
๋๋ค.), ๊ถ๊ธํ ์ ์ด ์๊ฒผ์ต๋๋ค. ์คํ ์์ค ์ฝ๋๋ฒ ์ด์ค์์ ์๋ณ์๋ก try
์ ๋น๋๋ฅผ ๋๊ท๋ชจ๋ก ๋ถ์ํ ์ฌ๋์ด ์์ต๋๊น? ๊ถ๊ธํ๊ณ ํ์์ ์ด์ด์ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ ๊ฒ์์ ํ์ต๋๋ค.
์ด ์ ์ฅ์์ ์๋ 11,108,770๊ฐ์ ์ค์ํ Go ๋ผ์ธ์์ try
๊ฐ ์๋ณ์๋ก ์ฌ์ฉ๋ ์ธ์คํด์ค๋ 63๊ฐ ์ ๋ถ๊ณผํ์ต๋๋ค. ๋ฌผ๋ก , ๋๋ ์ด๋ฌํ ์ฝ๋๋ฒ ์ด์ค(ํฌ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ ๊ทธ ์์ฒด๋ก ์ค์ํจ)๊ฐ Go ์ฝ๋์ ์ผ๋ถ์ ๋ถ๊ณผํ๋ค๋ ๊ฒ๊ณผ ๊ฐ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ง์ ๋ถ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ.
๋ํ try
๋ ๋ค๋ฅธ ํค์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ํจํค์ง์ ๊ณต๊ฐ API์์ ์ฐพ์ ์ ์์ต๋๋ค. ํค์๋ ์ถ๊ฐ๋ ํจํค์ง ๋ด๋ถ์๋ง ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ try
๋ฅผ ํค์๋๋ก ์ฌ์ฉํ์ฌ ์ด์ ์ ์ป์ ์ ์๋ ๋ช ๊ฐ์ง ์์ด๋์ด์ ๋ํ ์๋ฌธ์
๋๋ค.
๋ค์ ๊ตฌ์ฑ์ ์ ์ํฉ๋๋ค.
1) ํธ๋ค๋ฌ ์์
// The existing proposal, but as a keyword rather than builtin. When an error is
// "caught", the function returns all zero values plus the error. Nothing
// particularly new here.
func doSomething() (int, error) {
try SomeFunc()
a, b := try AnotherFunc()
// ...
return 123, nil
}
2) ํธ๋ค๋ฌ
์ค๋ฅ ํธ๋ค๋ฌ๋ ํจ์๊ฐ ์๋๋ผ ์ธ๋ผ์ธ๋๊ธฐ ์ํ ๋จ์ํ ์ฝ๋ ๋ธ๋ก์ ๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋์์ ํ์ธํ์ธ์.
func doSomething() (int, error) {
// Inline error handler
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
handler logAndContinue err {
log.Errorf("non-critical error: %v", err)
}
handler annotateAndReturn err {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d := try SomeFunc() else logAndContinue
e, f := try OtherFunc() else annotateAndReturn
// ...
return 123, nil
}
์ ์๋ ์ ํ ์ฌํญ:
try
ํจ์ ํธ์ถ๋ง ํ ์ ์์ต๋๋ค. ์๋์ try err
.try
๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. try
์ด ์ปจํ
์คํธ์ ๋ฐ๋ผ ์๋ํ๋ ๋ฐฉ์์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฒฐ์ฝ ๋นํฉํ์ง ์์ต๋๋ค(์ค๋ ๋์ ํจ์ฌ ์๋ถ๋ถ์์ ๋
ผ์๋ ๋ฐ์ ๊ฐ์ด).ํํ:
try
/ else
๊ตฌ๋ฌธ์ ๊ธฐ์กด "compound if"๋ก ๊ฐ๋จํ๊ฒ ๋์๊ฐ๋ง๋ ์ ์์ต๋๋ค.go
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
go
if a, b, err := SomeFunc(); err != nil {
return 0, errors.Wrap(err, "error in doSomething:")
}
check
/ handle
์ ๋ํ "์ด ์ค๋ฅ ์ฒ๋ฆฌ ํ๋ ์์ํฌ๋ ๊ตฌ์ ๊ธ์ต์๋ง ์ ํฉํฉ๋๋ค"๋ผ๋ ๋นํ์ ํผํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ "ํธ๋ค๋ฌ ์ฒด์ธ" ๋นํ์ ํผํฉ๋๋ค. ์์์ ์ฝ๋๋ ์ด๋ฌํ ์ฒ๋ฆฌ๊ธฐ ์ค ํ๋์ ๋ฐฐ์นํ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ ์ด ํ๋ฆ์ ์์๋์ง ์์ต๋๋ค.super return
๋ฅผ ์๋ฏธํ๊ธฐ ์ํด ํธ๋ค๋ฌ ๋ด๋ถ์์ return
๋ฅผ ํ์ด์ฌํนํ ํ์๊ฐ ์์ต๋๋ค. ํค์๋ ๋์ฉ์ ๋งค์ฐ ํผ๋์ค๋ฝ์ต๋๋ค. return
๋ return
๋ฅผ ์๋ฏธํ๋ฉฐ $# super return
๋ ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค.defer
๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ฌ๋น์ ๋ฐ์ ํ์๊ฐ ์์ต๋๋ค. ์ฃผ๋ก ๋ฆฌ์์ค ๋ฑ์ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ์ ์๊ฐํ ์ ์์ต๋๋ค.if err != nil
๋ธ๋ก๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.go vet
๊ฒ์ฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.์ด๋ฌํ ์์ด๋์ด๊ฐ ๋ค๋ฅธ ์ ์๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๋ชจ๋ ์ ์์ ๋ฐ๋ผ์ก์ผ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋ง์ ๊ธฐํ๋ฅผ ๋์ณค์ ์ ์์ต๋๋ค.
@brynbellomy ํค์๋ ๋ถ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค - ๋งค์ฐ ์ ์ฉํ ์ ๋ณด์
๋๋ค. try
๋ฅผ ํค์๋๋ก ์ฌ์ฉํด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. (๋น์ ์ API๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ค๊ณ ๋งํฉ๋๋ค. ์ฌ์ค์ด์ง๋ง try
๊ฐ ์ฌ์ ํ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ๋ฑ์ผ๋ก ํ์๋ ์ ์์ผ๋ฏ๋ก ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ํด๋น ํจํค์ง์ ํด๋ผ์ด์ธํธ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.)
๋น์ ์ ์ ์์ ๋ํด: ๋ช ๋ช ๋ ํธ๋ค๋ฌ๊ฐ ์์ด๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์๋์? (๊ทธ๊ฒ์ ์ ๋ ฅ ์์ค ์์ด ์ ์์ ๋จ์ํํ ๊ฒ์ ๋๋ค. ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ์์ ๋จ์ํ ๋ก์ปฌ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.)
๋น์ ์ ์ ์์ ๋ํด: ๋ช ๋ช ๋ ํธ๋ค๋ฌ๊ฐ ์์ด๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์๋์? (๊ทธ๊ฒ์ ์ ๋ ฅ ์์ค ์์ด ์ ์์ ๋จ์ํํ ๊ฒ์ ๋๋ค. ์ธ๋ผ์ธ ์ฒ๋ฆฌ๊ธฐ์์ ๋จ์ํ ๋ก์ปฌ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.)
@griesemer ์ค์ ๋ก โ ๋๋ ๊ทธ๊ฒ๋ค์ ํฌํจํ๋ ๊ฒ์ ๋ํด ๊ฝค ๋ฏธ์ง๊ทผํ ๋๋์ด ๋ค์์ต๋๋ค. ํ์คํ ๋ Go-ish ์์ด.
๋ฐ๋ฉด์ ์ฌ๋๋ค์ return
ํ ์ค์ง๋ฆฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ์ฌ ํ ์ค์ง๋ฆฌ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ๋ก๊ทธ์ด๊ณ return
์
๋๋ค. else
์ ์์ ๋ก์ปฌ ํจ์๋ก ์ ์์ํ๋ฉด ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ด ์์ค๋ ๊ฒ์
๋๋ค.
a, b := try SomeFunc() else err {
someLocalFunc(err)
return 0, err
}
(์ ๋ ์ฌ์ ํ if๋ฅผ ํฉ์ฑํ๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ ์ ํธํฉ๋๋ค.)
๊ทธ๋ฌ๋ ์์ ์ค๋ ๋์์ ๋
ผ์ํ ๊ฐ๋จํ gofmt
์กฐ์ ์ ๊ตฌํํ์ฌ ์ค๋ฅ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ํ ์ค์ง๋ฆฌ ๋ฐํ์ ์ป์ ์ ์์ต๋๋ค.
a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }
์ ์ ์์์ ์๋ก์ด ํค์๋๊ฐ ํ์ํ๊ฐ? ์ ์ ๋ผ:
SomeFunc() else return
a, b := SomeOtherFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }
@griesemer ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ค์ ํ ์ด๋ธ์ ์์ผ๋ฉด try/handle ๋๋ try/_label_์ ๋ํ ํ ๋ก ์ ์ํด ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ง๋ค ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด ์ ์์ ํนํ ํธ๋ค๋ฌ๋ฅผ ์๋ตํ์ผ๋ฉฐ ํธ๋ค๋ฌ๋ฅผ ์ ์ํ๊ณ ํธ์ถํ๋ ์๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํธ๋ค๋ฌ๋ฅผ ์ ์ํ๋ ์ฌ๋์ ๋จผ์ ํผ๋๋ฐฑ ํ์ธ/์ฒ๋ฆฌ ์ํค๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ๋น์ ์ด ๊ฟ๊พธ๋ ๊ฒ์ด ๋ฌด์์ด๋ ์ด๋ฏธ ๊ฑฐ๊ธฐ์ ์ค๋ช
๋์ด์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค :-)
https://github.com/golang/go/wiki/Go2ErrorHandlingํผ๋๋ฐฑ
@smonkewitz ์๋์, ์ง๊ธ๊น์ง ๋ค์ํ ๊ตฌ๋ฌธ ์คํ์์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธ๋ ํ ๋น ๋ฌธ์ ๋ฐ์ธ๋ฉ๋ ์ ํค์๋๋ ํด๋น ๋ฒ์ ์์ ํ์ํ์ง ์์ต๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -499808741
https://github.com/golang/go/issues/32437#issuecomment -499852124
https://github.com/golang/go/issues/32437#issuecomment -500095505
@ianlancetaylor ๋ ์์ง go ํ์์ ์ด ํน๋ณํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ๊ณ ๋ คํ ์ ์ด ์์ต๋๊น? ์ ์๋ try ๋ด์ฅ ํจ์๋งํผ ๊ตฌํํ๊ธฐ ์ฝ์ง๋ ์์ง๋ง ๋ ๊ด์ฉ์ ์ ๋๋ค. ~๋ถํ์ํ ํํ, ์ฃ์กํฉ๋๋ค.~
@deanveloper ์ ๋ช๋ช ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋งํ ๊ฒ์ ๋ฐ๋ณตํ๊ณ ์ถ์ง๋ง ์ ์์ ์ ๊ฐ์กฐํฉ๋๋ค. https://github.com/golang/go/issues/32437#issuecomment -498939499 @deanveloper ์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
try
๋ ์กฐ๊ฑด๋ถ ๋ฐํ์ ๋๋ค. ์ ์ด ํ๋ฆ๊ณผ ๋ฐํ์ ๋ชจ๋ Go์ ๋ฐ์นจ๋์์ ์ ์ง๋ฉ๋๋ค. ํจ์ ๋ด์ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ๋ค์ฌ์ฐ๊ธฐ๋๊ณ ๋ชจ๋ ๋ฐํ์return
๋ก ์์ํฉ๋๋ค. ์ด ๋ ๊ฐ์ง ๊ฐ๋ ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋์น๊ธฐ ์ฌ์ด ํจ์ ํธ์ถ๋ก ๋ง๋๋ ๊ฒ์ ์ฝ๊ฐ ๊ธฐ๋ถ์ด ๋์ฉ๋๋ค.
๋ํ ์ด ์ ์์์ try
๋ ๊ฐ์ ๋ฐํํ๋ ํจ์์ด๋ฏ๋ก ๋ ํฐ ํํ์์ ์ผ๋ถ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ์ฌ๋๋ค์ panic
๊ฐ ์ด๋ฏธ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๋ ๋ด์ฅ ํจ์์ ๋ํ ์ ๋ก๋ฅผ ์ธ์ ๋ค๊ณ ์ฃผ์ฅํ์ง๋ง panic
๋ ๋ ๊ฐ์ง ์ด์ ๋ก ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ฉด์ ์๋:
์ด๋ฌํ ์ด์ ๋ก try
๋ "์กฐ๊ธ ๋ฒ์ด๋" ๊ฒ ์ด์์ผ๋ก ๋๊ปด์ง๋ฉฐ ๊ทผ๋ณธ์ ์ผ๋ก ์ฝ๋ ๊ฐ๋
์ฑ์ ํด๋ฅผ ๋ผ์น๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค๋๋ Go ์ฝ๋๋ฅผ ์ฒ์ ์ ํ๋ฉด ๊ฐ๋ฅํ ์ข
๋ฃ ์ง์ ๊ณผ ์ ์ด ํ๋ฆ ์ง์ ์ ์ฐพ๊ธฐ ์ํด ๋น ๋ฅด๊ฒ ํ์ด๋ณผ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด Go ์ฝ๋์ ๋งค์ฐ ๊ฐ์น ์๋ ์์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. try
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์์ฑ์ด ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๊ฐ ๋๋ฌด ์ฌ์์ง๋๋ค.
์ฝ๋ ๊ฐ๋
์ฑ์ ์ค์ํ๋ Go ๊ฐ๋ฐ์๋ ์ด๋ฌํ ๊ฐ๋
์ฑ ํจ์ ์ ํผํ๋ try
์ ๋ํ ์ฌ์ฉ ๊ด์ฉ๊ตฌ์ ์๋ ดํ ๊ฐ๋ฅ์ฑ์ด ์์์ ์ธ์ ํฉ๋๋ค. ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋ง์ Go ๊ฐ๋ฐ์์๊ฒ ํต์ฌ ๊ฐ์น์ธ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ try
๊ฐ ๋ชจ๋ ์ฌ๋์ด ๋ฐฐ์ธ ์ ์๋๋ก ์ธ์ด์ ์๋ก์ด ๊ฐ๋
์ ์ถ๊ฐํ๋ ๋ฌด๊ฒ๋ฅผ ์งํฑํ ๋งํผ ๊ธฐ์กด ์ฝ๋ ๊ด์ฉ๊ตฌ์ ์ถฉ๋ถํ ๊ฐ์น๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ๋
์ฑ์ ์ฝ๊ฒ ์์์ํฌ ์ ์๋ค๋ ๊ฒ์ ๋ถ๋ช
ํ์ง ์์ต๋๋ค.
````
๋ง์ฝ != "๊นจ์ก๋ค" {
์์ ํ์ง ๋ง์ธ์(๊ทธ๊ฒ)
}
@ChrisHines ๊ทํ์ ์์ ์ ๋ํด(์ด ์ค๋ ๋์ ๋ค๋ฅธ ๊ณณ์์ ๋ฐํฅ๋จ) ๋ ๋ค๋ฅธ ์ ํ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
try
๋ฌธ(ํธ๋ค๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ํฌํจ)์ ์์ฒด ๋ผ์ธ์์ ๋ฐ์ํด์ผ ํฉ๋๋ค.์ฌ์ ํ ์๊ฐ์ ๋
ธ์ด์ฆ๊ฐ ํฌ๊ฒ ๊ฐ์ํ๋ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด return
์ฃผ์์ด ๋ฌ๋ฆฐ ๋ฐํ๊ณผ try
์ฃผ์์ด ๋ฌ๋ฆฐ ์กฐ๊ฑด๋ถ ๋ฐํ์ด ๋ณด์ฅ๋๋ฉฐ ์ด๋ฌํ ํค์๋๋ ํญ์ ์ค์ ์์ ๋ถ๋ถ์ ์์ต๋๋ค(์ต์
์ ๊ฒฝ์ฐ ๋ณ์ ํ ๋น ๋ฐ๋ก ๋ค์ ์์).
๋ฐ๋ผ์ ์ด๋ฌํ ์ ํ์ ๋์ผ์ค๋ ์์ต๋๋ค.
try EmitEvent(try (try DecodeMsg(m)).SaveToDB())
๊ทธ๋ฌ๋ ์คํ๋ ค ์ด๊ฒ์:
dm := try DecodeMsg(m)
um := try dm.SaveToDB()
try EmitEvent(um)
์ด๊ฒ์ ์ฌ์ ํ โโ์ด๋ณด๋ค ๋ช ํํ๊ฒ ๋๊ปด์ง๋๋ค.
dm, err := DecodeMsg(m)
if err != nil {
return nil, err
}
um, err := dm.SaveToDB()
if err != nil {
return nil, err
}
err = EmitEvent(um)
if err != nil {
return nil, err
}
์ด ๋์์ธ์ ๋ํด ๋ด๊ฐ ์ข์ํ๋ ํ ๊ฐ์ง๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ฃผ์์ ์ถ๊ฐํ์ง ์๊ณ ์ค๋ฅ๋ฅผ ์กฐ์ฉํ ๋ฌด์ํ ์ ์๋ค๋ ๊ฒ ์
๋๋ค. ๋ฐ๋ฉด์ ์ง๊ธ์ x, _ := SomeFunc()
(๋ฌด์๋ ๋ฐํ ๊ฐ์ด ๋ฌด์์
๋๊น? ์ค๋ฅ? ๋ค๋ฅธ ๋ฌด์์
๋๊น?)๊ฐ ํ์๋์ง๋ง ์ด์ ๋ช
ํํ๊ฒ ์ฃผ์์ ๋ฌ์์ผ ํฉ๋๋ค.
x := try SomeFunc() else err {}
์ ์์ ์ง์ํ๋ ์ด์ ๊ฒ์๋ฌผ ์ดํ๋ก @jagv (๋งค๊ฐ๋ณ์ ์๋ try
๋ *error
$๋ฅผ ๋ฐํ)์ @josharian (์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ๋ ์ด๋ธ์ด ์ง์ ๋จ)์ด ๊ฒ์ํ ๋ ๊ฐ์ง ์์ด๋์ด๋ฅผ ๋ณด์์ต๋๋ค. ์ฝ๊ฐ ์์ ๋ ํ์์ ์ ์์ ์๋นํ ํฅ์์ํฌ ๊ฒ์
๋๋ค.
์ด ์์ด๋์ด๋ฅผ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ถ๊ฐ ์์ด๋์ด์ ํฉ์น๋ฉด try
์ ๋ค ๊ฐ์ง ๋ฒ์ ์ด ์์ต๋๋ค.
defer
๋ฌธ์ผ๋ก ์ฅ์ํ ์ ์์ต๋๋ค.์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ defer
๋ณด๋ค ์ค๋ฅ๋ฅผ ์ฅ์ํ๋(๋๋ ๋ก์ปฌ๋ก ์ฒ๋ฆฌํ ๋ค์ nil์ ๋ฐํํ๋) ๋ ๋์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ์ข์ํ์ง ์๋ ์ฌ๋์ ์ฌ์ ํ โโ# 2๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํจ์์ ๋ ๋ถ๋ถ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ ์ด๋ธ/์ฝ๋๋ฅผ ๋ฐฐ์นํ๊ณ ํจ์ ๋ณธ๋ฌธ์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ๋ค์ ์ด๋ํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ ์ฉํ๊ณ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ํ์ด ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๋ ์ด๋ธ ๋ฐ goto
๋์์ ์ ๋ชฉ( @josharian ์ด ๋งํ ๋๋ก)์ #26058์ด ๋จผ์ ์์ ๋๋๋ก ์ ์ฉํ์ง๋ง ์ด์จ๋ ์์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ์ด๋ธ ์ด๋ฆ์ #4์ ์ถฉ๋ํ๋ฏ๋ก panic
๊ฐ ๋ ์ ์์ต๋๋ค.
panic
์
๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๊ฒ์ด ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋ try
์ ์ ์ผํ ๋ฒ์ ์ด๋ผ๋ฉด ERP๊ฐ ํ์ํ์ง ์์ต๋๋ค.ํ ์คํธ ํจํค์ง๊ฐ ์ถ๊ฐ ๋ด์ฅ ๋๋ ๊ธฐํ ๋ณ๊ฒฝ ์์ด ์ง๊ธ์ฒ๋ผ ์๋ํ ์ ์๋๋ก ์ด๊ฒ์ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ _์น๋ช ์ ์ธ_ ์๋๋ฆฌ์ค์์๋ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ try
์ ๋ณ๋ ๋ฒ์ ์ด์ด์ผ ํ๋ฉฐ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ๋ถ๊ธฐํ ๋ค์ ๊ทธ๋ก๋ถํฐ ํจ๋์ ์ผ์ผํค๋ ค๋ฉด ์ฌ์ ํ ERP๊ฐ ํ์ํฉ๋๋ค.
์ด๊ธฐ ์ ์์ ๋ํ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ ํ์ ๋ฐ์ ์ค ํ๋๋ ํจ์๊ฐ ๋ฐํ๋๋ ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ์ฌ์ด ๊ฐ์์ฑ์ ์์คํ๋ ๊ฒ์ ๋ํ ์ฐ๋ ค์์ต๋๋ค.
์๋ฅผ ๋ค์ด, @deanveloper ๋ https://github.com/golang/go/issues/32437#issuecomment -498932961์์ ๊ทธ ์ฐ๋ ค๋ฅผ ์์ฃผ ์ ํํํ์ผ๋ฉฐ, ์ฌ๊ธฐ์์ ๊ฐ์ฅ ๋์ ์ง์ง๋ฅผ ๋ฐ์ ๋๊ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@dominikh ๋ https://github.com/golang/go/issues/32437#issuecomment -499067357์ ์ผ์ต๋๋ค.
gofmt's ์ฝ๋์์ ๋ฐํ์ ํญ์ /^\t*return /๊ณผ ์ผ์นํฉ๋๋ค. ๋์ ์์ด๋ ๋์ผ๋ก ์๋ณํ ์ ์๋ ๋งค์ฐ ์ฌ์ํ ํจํด์ ๋๋ค. ๋ฐ๋ฉด์ try๋ ์ฝ๋์ ์ด๋ ๊ณณ์์๋ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ํจ์ ํธ์ถ์์ ์์๋ก ๊น์์ด ์ค์ฒฉ๋ฉ๋๋ค. ๊ต์ก์ ์๋ฌด๋ฆฌ ๋ง์ด ํด๋ ๋๊ตฌ ์ง์ ์์ด ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ์ฆ์ ๋ฐ๊ฒฌํ ์๋ ์์ต๋๋ค.
์ด๋ฅผ ๋๊ธฐ ์ํด @brynbellomy ๋ ์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ต๋๋ค.
๋ชจ๋ try ๋ฌธ(ํธ๋ค๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋)์ ์์ฒด ์ค์์ ๋ฐ์ํด์ผ ํฉ๋๋ค.
๋ ๋์๊ฐ ํ ๋น์ ๊ฒฝ์ฐ์๋ try
๊ฐ ์ค์ ์์์ด ๋์ด์ผ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ ์ ์์ต๋๋ค.
try dm := DecodeMsg(m)
try um := dm.SaveToDB()
try EmitEvent(um)
๋ค์ ๋์ ( @brynbellomy ์ ์์์):
dm, err := DecodeMsg(m)
if err != nil {
return nil, err
}
um, err := dm.SaveToDB()
if err != nil {
return nil, err
}
err = EmitEvent(um)
if err != nil {
return nil, err
}
ํธ์ง์๋ IDE์ ๋์ ์์ด๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ฉด์ ์๋นํ ์์ ๊ฐ์์ฑ์ ์ ์งํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์์กดํ๋ ํ์ฌ ์ ์๋ ์ฐ๊ธฐ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์๊ณผ ํจ๊ป ์๋ํ๊ฑฐ๋ ์ผ๋ฐ ํธ๋ค๋ฌ ๊ธฐ๋ฅ์ ์ง์ ํ๋ ๊ฒ๊ณผ ํจ๊ป ์๋ํ ์ ์์ต๋๋ค. (๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ์๊ตฌํ์ง ์๊ณ ํธ๋ค๋ฌ ํจ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ์๊ตฌํ๋ ๊ฒ๋ณด๋ค ๋์๊ฒ ๋ ๋์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ทธ๊ฒ์ ๋ณ๊ฐ์ ์์ ์ ๋๋ค).
์ ์์์๋ ๋ค์ ์๊ฐ ํฌํจ๋ฉ๋๋ค.
info := try(try(os.Open(file)).Stat()) // proposed try built-in
๋์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
try f := os.Open(file)
try info := f.Stat()
์ ์๋ ๊ตฌ๋ฌธ๋งํผ ์งง์ง๋ ์๋๋ผ๋ ์ค๋๋ ๋๊ตฐ๊ฐ๊ฐ ์์ฑํ ์ ์๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ์ฌ์ ํ ์์ฉ๊ตฌ์ ๊ฐ์์ ๋๋ค. ์๋ง๋ ์ถฉ๋ถํ ์งง์ง ์์๊น์?
@elagergren-spideroak์ ๋ค์ ์๋ฅผ ์ ๊ณตํ์ต๋๋ค.
try(try(try(to()).parse().this)).easily())
์๋ง๋ ์๋์ ์ธ ์์ ์ด๋ ์ฝ๊ฐ์ ์ ๋จธ์ผ ์ ์๋ ์ผ์นํ์ง ์๋ ๊ดํธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๊ทธ ์๊ฐ 2 try
๋๋ 3 try
์ ๊ฐ์ง ์๋์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ์ด์จ๋ try
๋ก ์์ํ๋ 2-3์ค์ ๊ฑธ์ณ ๊ทธ๊ฒ์ ํผ๋จ๋ฆฌ๋๋ก ์๊ตฌํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์
๋๋ค.
@thepudds , ์ด๊ฒ์ ๋ด๊ฐ ์ด์ ๋๊ธ์์ ์ป์ ๊ฒ์ ๋๋ค. ์ฃผ์ด์ง ๊ฒ์ ์ ์ธํ๊ณ
try f := os.Open(file)
try info := f.Stat()
๋ถ๋ช
ํ ํด์ผ ํ ์ผ์ try
๋ฅผ ๊ดํธ ์์ ๋ ์ด์์ ๋ฌธ์ฅ์ ๋ฃ์ ์ ์๋ try ๋ธ๋ก ์ผ๋ก ์๊ฐํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์๋ ๋ ์ ์์ต๋๋ค
try (
f := os.Open(file)
into := f.Stat()
)
์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ์ค์ฒฉ์๋ ๋์ผํ ์์ ์ด ์ ์ฉ๋ฉ๋๋ค. ์ด์ ์์ ๋ด์ฉ์ด ๋ ์ ์์ต๋๋ค.
try info := os.Open(file).Stat()
์ปดํ์ผ๋ฌ๋ ํจ์ ์๋ช ์์ Open์ด ์ค๋ฅ ๊ฐ์ ๋ฐํํ ์ ์๊ณ try ๋ธ๋ก์ ์๋ ๊ฒ์ฒ๋ผ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ ๋ค์ ๊ธฐ๋ณธ ๋ฐํ ๊ฐ์ ๋ํด Stat()๋ฅผ ํธ์ถํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ค์์ ์์ฑ๋๋ ์ค๋ฅ ๊ฐ์ด ์๊ฑฐ๋ ๋ก์ปฌ์์ ์ฒ๋ฆฌ๋๋ ๋ช ๋ น๋ฌธ์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋น์ ์ ์ด์ ๋งํ ์ ์์ต๋๋ค
try (
f := os.Open(file)
debug("f: %v\n", f) // debug returns nothing
into := f.Stat()
)
์ด๋ฅผ ํตํด try ๋ธ๋ก์ ์ฌ๋ฐฐ์ดํ์ง ์๊ณ ๋ ์ฝ๋๋ฅผ ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ์ด์ํ ์ด์ ๋ก ์ฌ๋๋ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ค๋ช ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค! ๊ทธ๋ค์ ์ํ๋ค
try(try(try(to()).parse()).this)).easily())
๋ด๊ฐ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ ๋์
try to().parse().this().easily()
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ ํํ ๋์ผํ ์ค๋ฅ ๊ฒ์ฌ ์ฝ๋๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค. ๋ด ๊ฒฌํด๋ ํ์ํ ๊ฒฝ์ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ํญ์ ํน์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. try
(๋๋ ๊ทธ๊ฒ์ ์ ํธํ๋ ๋ชจ๋ ๊ฒ)์ ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ(ํธ์ถ์์๊ฒ ์ ๋ฌํ๋ ๊ฒ)๋ฅผ ๋จ์ํ ์ ๋ฆฌํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ด์ ์ ์ปดํ์ผ๋ฌ๊ฐ ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์๋ณ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ฌ ์์ ๋ค ๊ฐ์ง ๊ธฐ๋ฅ ์ค ์ด๋ค ๊ธฐ๋ฅ์ด ์คํจํ๋์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
try
๊ฐ ๋ค๋ฅธ ํํ์ ์์ ๋ํ๋๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋
์ฑ์ ๋ํด ๋ค์ ์ฐ๋ คํ์ต๋๋ค. ๊ทธ๋์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ grep "return .*err$"
๋ฅผ ์คํํ๊ณ ๋ฌด์์๋ก ๋ธ๋ก์ ์ฝ๊ธฐ ์์ํ์ต๋๋ค. 7214๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ ๋ ๋จ์ง ๋ช ๋ฐฑ๊ฐ๋ง ์ฝ์์ต๋๋ค.
์ฃผ๋ชฉํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ฌํญ์ try
๊ฐ ์ ์ฉ๋๋ ๊ณณ์์ ๊ฑฐ์ ๋ชจ๋ ๋ธ๋ก์ ์ข ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์
๋๋ค.
๋ ๋ฒ์งธ๋ ์ด๋ค ์ค 10๋ถ์ 1 ๋ฏธ๋ง์ธ ๊ทน์์๋ง์ด ๋ค๋ฅธ ํํ์ ์์ try
๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ x := try(...)
๋๋ ^try(...)$
ํ์์ ๋ช
๋ น๋ฌธ์
๋๋ค.
๋ค์์ try
๊ฐ ๋ค๋ฅธ ํํ์ ์์ ๋ํ๋๋ ๋ช ๊ฐ์ง ์์
๋๋ค.
ํ ์คํธ/ํ ํ๋ฆฟ
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
lessOrEqual, err := le(arg1, arg2)
if err != nil {
return false, err
}
return !lessOrEqual, nil
}
๋ค์์ด ๋ฉ๋๋ค:
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
return !try(le(arg1, arg2)), nil
}
ํ ์คํธ/ํ ํ๋ฆฟ
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
index, err := prepareArg(index, v.Type().Key())
if err != nil {
return reflect.Value{}, err
}
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
๋๋ค
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
if x := v.MapIndex(try(prepareArg(index, v.Type().Key()))); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
(์ด๊ฒ์ ๋ด๊ฐ ๋ณธ ๊ฐ์ฅ ์์ฌ์ค๋ฌ์ด ์์ ๋๋ค)
์ ๊ท ํํ์/๊ตฌ๋ฌธ:
regexp/syntax/parse.go
func Parse(s string, flags Flags) (*Regexp, error) {
...
if c, t, err = nextRune(t); err != nil {
return nil, err
}
p.literal(c)
...
}
๋๋ค
func Parse(s string, flags Flags) (*Regexp, error) {
...
c, t = try(nextRune(t))
p.literal(c)
...
}
์ด๊ฒ์ ๋ค๋ฅธ ํํ์ ๋ด๋ถ์์ ์๋ํ๋ ์๋ ์๋์ง๋ง ๊ฐ๋
์ฑ์ ํฅ์์ํค๊ธฐ ๋๋ฌธ์ ํธ์ถํ๊ณ ์ถ์ต๋๋ค. c
๋ฐ t
์ ๊ฐ์ด if ๋ฌธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์์ ์ฌ๊ธฐ์์ ํจ์ฌ ๋ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌผ/http
net/http/request.go:readRequest
mimeHeader, err := tp.ReadMIMEHeader()
if err != nil {
return nil, err
}
req.Header = Header(mimeHeader)
๋ค์์ด ๋ฉ๋๋ค:
req.Header = Header(try(tp.ReadMIMEHeader())
๋ฐ์ดํฐ๋ฒ ์ด์ค/SQL
if driverCtx, ok := driveri.(driver.DriverContext); ok {
connector, err := driverCtx.OpenConnector(dataSourceName)
if err != nil {
return nil, err
}
return OpenDB(connector), nil
}
๋๋ค
if driverCtx, ok := driveri.(driver.DriverContext); ok {
return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
}
๋ฐ์ดํฐ๋ฒ ์ด์ค/SQL
si, err := ctxDriverPrepare(ctx, dc.ci, query)
if err != nil {
return nil, err
}
ds := &driverStmt{Locker: dc, si: si}
๋๋ค
ds := &driverStmt{
Locker: dc,
si: try(ctxDriverPrepare(ctx, dc.ci, query)),
}
๊ทธ๋ฌผ/http
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
cc, err := p.t.dialclientconn(addr, singleuse)
if err != nil {
return nil, err
}
return cc, nil
}
๋๋ค
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
return try(p.t.dialclientconn(addr, singleuse))
}
๊ทธ๋ฌผ/http
func (f *http2Framer) endWrite() error {
...
n, err := f.w.Write(f.wbuf)
if err == nil && n != len(f.wbuf) {
err = io.ErrShortWrite
}
return err
}
๋๋ค
func (f *http2Framer) endWrite() error {
...
if try(f.w.Write(f.wbuf) != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
(์ด๊ฑฐ ์ ๋ง ์ข์ํฉ๋๋ค.)
๊ทธ๋ฌผ/http
if f, err := fr.ReadFrame(); err != nil {
return nil, err
} else {
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
๋๋ค
hc = try(fr.ReadFrame()).(*http2ContinuationFrame)// guaranteed by checkFrameOrder
}
(์ญ์ ์ข๋ค.)
๊ทธ๋ฌผ :
if ctrlFn != nil {
c, err := newRawConn(fd)
if err != nil {
return err
}
if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
return err
}
}
๋๋ค
if ctrlFn != nil {
try(ctrlFn(fd.ctrlNetwork(), laddr.String(), try(newRawConn(fd))))
}
์ด์ฉ๋ฉด ์ด๊ฒ์ ๋๋ฌด ๋ง์ผ๋ฉฐ ๋์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
if ctrlFn != nil {
c := try(newRawConn(fd))
try(ctrlFn(fd.ctrlNetwork(), laddr.String(), c))
}
์ ๋ฐ์ ์ผ๋ก, ๋๋ ๋ด๊ฐ ์ฝ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ๋ํ try
์ ํจ๊ณผ๋ฅผ ์์ฃผ ์ข์ํฉ๋๋ค.
๋ง์ง๋ง ์์ : ์ ์์์ ๋ช ๊ฐ์ง ์์ ๋ฅผ ๋์ด ์ฝ๋๋ฅผ ์ฝ๋ ๋ฐ try
๊ฐ ์ ์ฉ๋๋ ๊ฒ์ ๋ณด๊ณ ๊นจ๋ฌ์์ ์ป์์ต๋๋ค. try
(ํ๋ก๊ทธ๋จ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ณํํ๋ ๋๊ตฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฐพ์ ๋ด์ฉ์ด ์ ์ง๋๋์ง ํ์ธํ๊ธฐ ์ํด github์ ์ธ๊ธฐ ์๋ ํจํค์ง์ ๋ํด ์์ฑ๋ diffs์ ์ํ์ ์ฝ๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค. ๊ทธ๋ฌํ ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ์ ์ ์์ ํจ๊ณผ์ ๋ํ ์ถ๊ฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
@crawshaw ์ด๋ ๊ฒ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ค์ ๋ก ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ด์ ์ข์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์๋ํ๋ ๊ฒ์ ๋ณด๋ ์ง๊ธ๊น์ง ๋ฌด์ํด ์๋ ์ธ๋ผ์ธ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ฃผ์ฅ์ ๋ ์ง์งํ๊ฒ ๋ฐ์๋ค์ด๊ฒ ๋์์ต๋๋ค.
์ด๊ฒ์ try
๋ฅผ ๋ช
๋ น๋ฌธ์ผ๋ก ๋ง๋๋ @thepudds ์ ํฅ๋ฏธ๋ก์ด ์ ์๊ณผ ๋งค์ฐ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์ ๋ฅผ ๋ค์ ์์ฑํ์ผ๋ฉฐ ํํ์- try
๋๋ ๋๋ฌด ๋ง์ ์ถ๊ฐ ๋ผ์ธ์ ์๊ตฌํ์ง ์๊ณ ํ์ ์ ์ง:
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
try lessOrEqual := le(arg1, arg2)
return !lessOrEqual, nil
}
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
try index := prepareArg(index, v.Type().Key())
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
func Parse(s string, flags Flags) (*Regexp, error) {
...
try c, t = nextRune(t)
p.literal(c)
...
}
try mimeHeader := tp.ReadMIMEHeader()
req.Header = Header(mimeHeader)
if driverCtx, ok := driveri.(driver.DriverContext); ok {
try connector := driverCtx.OpenConnector(dataSourceName)
return OpenDB(connector), nil
}
์ด๊ฒ์ try
-ed์ฌ์ผ ํ๋ ์ฌ๋ฌ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ try
ํํ์๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ฆผ์์ง๋ง ์ ๋ ์ฌ์ ํ ์ด ์ ์ถฉ์์ ๊ท ํ์ ์ ํธํฉ๋๋ค.
try si := ctxDriverPrepare(ctx, dc.ci, query)
ds := &driverStmt{Locker: dc, si: si}
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ๋ํ ์ต์ ์ ๊ฒฝ์ฐ์ด๋ฉฐ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
try cc := p.t.dialclientconn(addr, singleuse)
return cc, nil
}
๋๋ if try
๊ฐ ํฉ๋ฒ์ธ์ง ๋๋ ํฉ๋ฒ์ด์ด์ผ ํ๋์ง ๋ ์์ ๊ณผ ํ ๋ก ํ์ง๋ง ์ ๊ทธ๊ฒ์ด ๋์ด์๋ ์ ๋๋ฉฐ ์ฌ๊ธฐ์์ ์์ฃผ ์ ์๋ํ๋์ง ํฉ๋ฆฌ์ ์ธ ์ค๋ช
์ ์ ์ํ ์ ์์์ต๋๋ค.
func (f *http2Framer) endWrite() error {
...
if try n := f.w.Write(f.wbuf); n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
try f := fr.ReadFrame()
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
if ctrlFn != nil {
try c := newRawConn(fd)
try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
}
@crawshaw ์ ์์ ๋ฅผ ํ์ด๋ณด๋ฉด์ ์ ์ด ํ๋ฆ์ด ์ข ์ข ์ค๊ณ์ ๋์ฑ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ๋งํผ ์ถฉ๋ถํ ๋น๋ฐ์ค๋ฝ๊ฒ ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๋ ํ์ ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ฝ๊ฐ์ ๋ณต์ก์ฑ์ด๋ผ๋ ๊ด๋ จ์ง๋ ๊ฒ์ ์ฝ๊ธฐ๊ฐ ์ด๋ ต๊ณ ๋ง์ณ์ง๊ธฐ ์ฝ์ต๋๋ค. ๊ณ ๋ ค๋๋ ์ต์ ์ ๋ณด๋ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ณดํธ๋ ์ธ์ด์์ ๋ณต์กํ ์ ์ด ํ๋ฆ์ ์์ธ์ ์ผ๋ก ์ฑ๊ฒฉ์ด ์ข์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
func (f *http2Framer) endWrite() error {
...
if try(f.w.Write(f.wbuf) != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
๋ํ try
๋ "์๋"ํ์ง ์์ต๋๋ค. "๋ณดํธ ๊ณ์ ๊ธฐ"์
๋๋ค. ์ ์์ ๊ธฐ๋ณธ ์๋ฏธ๊ฐ ๊บผ์ ธ ์์ผ๋ฉด ๊ฒฐ๊ณผ ์ฝ๋์๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ฌ์ค์ ๋๋ผ์ง ์์ต๋๋ค.
func (f *http2Framer) endWrite() error {
...
relay n := f.w.Write(f.wbuf)
return checkShortWrite(n, len(f.wbuf))
}
try ๋ฌธ์ ๋ง๋ค๋ฉด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ ๊ฐ๊ณผ ์์ ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
try c, @ := newRawConn(fd) // return
try c, <strong i="6">@panic</strong> := newRawConn(fd) // panic
try c, <strong i="7">@hname</strong> := newRawConn(fd) // invoke named handler
try c, <strong i="8">@_</strong> := newRawConn(fd) // ignore, or invoke "ignored" handler if defined
์ต์ํ ํจ๋ ๋ฐ ๋ฌด์ ์์ ์ ๋ํด์๋ ํ์ ํํ์ ๊ตฌ๋ฌธ์ด ํ์ํฉ๋๋ค(Russ๋ ์ด๊ฒ์ด ์๊ตฌ ์ฌํญ์ด๋ผ๊ณ ๋งํ์ต๋๋ค).
๋จผ์ @crawshaw ๊ฐ ์๊ฐ์ ๋ด์ด ๋๋ต 200๊ฐ์ ์ค์ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ณ ์์ ์ฌ๋ ค ๊น์ ๊ธ์ ์์ฑํด ์ฃผ์ ๋ฐ ๋ํด ๋ฐ์๋ฅผ ๋ณด๋ ๋๋ค.
๋์งธ, @jimmyfrasche , http2Framer
์์์ ๋ํ ๊ทํ์ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋
if try
๊ฐ ํฉ๋ฒ์ธ์ง ๋๋ ํฉ๋ฒ์ด์ด์ผ ํ๋์ง ๋ ์์ ๊ณผ ํ ๋ก ํ์ง๋ง, ์ ๊ทธ๊ฒ์ด ๋์ด์๋ ์ ๋๋ฉฐ ์ฌ๊ธฐ์์ ์์ฃผ ์ ์๋ํ๋์ง ํฉ๋ฆฌ์ ์ธ ์ค๋ช ์ ์ ์ํ ์ ์์์ต๋๋ค.```
func (f *http2Framer) endWrite() ์ค๋ฅ {
...
์๋ n := fwWrite(f.wbuf); n != len(f.wbuf) {
io.ErrShortWrite ๋ฐํ
}
๋ฐํ ์์
}
At least under what I was suggesting above in https://github.com/golang/go/issues/32437#issuecomment-500213884, under that proposal variation I would suggest `if try` is not allowed.
That `http2Framer` example could instead be:
func (f *http2Framer) endWrite() ์ค๋ฅ {
...
์๋ n := fwWrite(f.wbuf)
๋ง์ฝ n != len(f.wbuf) {
io.ErrShortWrite ๋ฐํ
}
๋ฐํ ์์
}
``
That is one line longer, but hopefully still "light on the page". Personally, I think that (arguably) reads more cleanly, but more importantly it is easier to see the
์๋`.
@deanveloper ๋ https://github.com/golang/go/issues/32437#issuecomment -498932961์์ ์์์ ์ผ์ต๋๋ค.
ํจ์์์ ๋์์ค๋ ๊ฒ์ "์ ์ฑํ" ์ผ์ธ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
ํน์ http2Framer
์์ ๋ ๊ฐ๋ฅํ ํ ์งง์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ try
๊ฐ ํ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ ํจ์์์ ๋ "์ ์ฑํ" ๋ฐํ์ ๋ณด๋ฅํฉ๋๋ค.
@crawshaw ์ธ๊ธ:
๋ ๋ฒ์งธ๋ 10๋ถ์ 1๋ ๋์ง ์๋ ์์ฃผ ์ ์ ์์ ์ฌ๋๋ค์ด ๋ค๋ฅธ ํํ์ ์์ try๋ฅผ ๋ฃ์ ๊ฒ์ด๋ผ๋ ์ ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ x := try(...) ๋๋ ^try(...)$ ํ์์ ๋ช ๋ น๋ฌธ์ ๋๋ค.
์๋ง๋ try
์ ๋ณด๋ค ์ ํ๋ ํ์์ผ๋ก 10๊ฐ ์ค 1๊ฐ์ ์์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก๋ง ๋์์ด ๋๋ ๊ฒ์ด ์ข์ต๋๋ค try
๋ผ์ธ์์ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํฉ๋๊น?
@jimmyfrasche
@crawshaw ์ด๋ ๊ฒ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ค์ ๋ก ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ด์ ์ข์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์๋ํ๋ ๊ฒ์ ๋ณด๋ ์ง๊ธ๊น์ง ๋ฌด์ํด ์๋ ์ธ๋ผ์ธ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ฃผ์ฅ์ ๋ ์ง์งํ๊ฒ ๋ฐ์๋ค์ด๊ฒ ๋์์ต๋๋ค.
์ด๊ฒ์
try
๋ฅผ ๋ช ๋ น๋ฌธ์ผ๋ก ๋ง๋๋ @thepudds ์ ํฅ๋ฏธ๋ก์ด ์ ์๊ณผ ๋งค์ฐ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์ ๋ฅผ ๋ค์ ์์ฑํ์ผ๋ฉฐ ํํ์-try
๋๋ ๋๋ฌด ๋ง์ ์ถ๊ฐ ๋ผ์ธ์ ์๊ตฌํ์ง ์๊ณ ํ์ ์ ์ง:func gt(arg1, arg2 reflect.Value) (bool, error) { // > is the inverse of <=. try lessOrEqual := le(arg1, arg2) return !lessOrEqual, nil }
์ฒซ ๋ฒ์งธ ์๋ ๋ด๊ฐ try
ํํ์์ ์ ํธํ๋ ์ด์ ๋ฅผ ์ ๋ณด์ฌ์ค๋๋ค. ๊ทํ์ ๋ฒ์ ์์๋ le
์ ๋ํ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ๋ฃ์ด์ผ ํ์ง๋ง ๊ทธ ๋ณ์์๋ le
๋ผ๋ ์ฉ์ด๊ฐ ์ด๋ฏธ ์์ํ์ง ์๋๋ค๋ ์๋ฏธ๋ก ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฏธ๊ฐ ์๊ฑฐ๋(์ x
) ์ค๋ณต๋์ง ์๋(์ lessOrEqual
) ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค. expression- try
๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ ๋ณ์๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ฐจ๋ผ๋ฆฌ ์ต๋ช ์ผ๋ก ๋จ๊ฒจ๋๋ ๊ฒ์ด ๋ ๋์ ์ด๋ฆ์ ์ง๊ธฐ ์ํด ์ ์ ์ ๋ ธ๋ ฅ์ ๋ค์ผ ํ์๊ฐ ์์ต๋๋ค.
try
(ํค์๋)๊ฐ ์ค์ ์์ ๋ถ๋ถ์ผ๋ก ์ด๋๋ ๋ง์ง๋ง ๋ช ๊ฐ์ ๊ฒ์๋ฌผ ๋ค์ ์ ์ง์์ ์ ๊ณตํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. return
์ ๊ฐ์ ์๊ฐ์ ๊ณต๊ฐ์ ๊ณต์ ํด์ผ ํฉ๋๋ค.
Re: @jimmyfrasche ๊ฐ try
๋ฅผ ๋ณตํฉ if
๋ช
๋ น๋ฌธ ๋ด์์ ํ์ฉํ๋๋ก ์ ์ํ์ต๋๋ค. ๋ฐ๋ก ์ด๊ฒ์ด ๋ช ๊ฐ์ง ์ด์ ๋ก ์ฌ๊ธฐ ๋ง์ ์ฌ๋๋ค์ด ํผํ๋ ค๊ณ ํ๋ ๊ฒ์
๋๋ค.
try
ํํ์์ด ์ค์ ๋ก ๋จผ์ ํ๊ฐ๋๊ณ ํจ์๊ฐ ๋ฐํ๋๋๋ก ํ ์ ์์ง๋ง if
๋ค์ ๋ํ๋ฉ๋๋ค.try
๊ฐ ์ค์ ๋ก ์ฒ๋ฆฌ๋์ง ์๋๋ค๋ ๊ฒ์ ๋ ๋ช
ํํ๊ฒ ๋ง๋ญ๋๋ค(์์ ํ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ )์ฌ๋๋ค์ด try
๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ์ฝ๊ฐ ๋ค๋ฅธ ๊ฐ๋์์ ์ด ์ํฉ์ ์ ๊ทผํ ์ ์์ต๋๋ค. try
/ else
๊ตฌ๋ฌธ์ ํ์ ์กฐ๊ฑด( err
๋ฐ n
์ ๋ชจ๋ ๋ฐํํ๋ ๋ง์ I/O ํจ์์ ๊ณตํต ํจํด)์ ํฌํจํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
func (f *http2Framer) endWrite() error {
// ...
try n := f.w.Write(f.wbuf) else err {
return errors.Wrap(err, "error writing:")
} else if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
.Write
์์ ๋ฐํ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒฝ์ฐ .Write
์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๋ช
ํํ ์ฃผ์์ด ์์ต๋๋ค(@thepudds์์ ์ง์ ํ ๋๋ก).
func (f *http2Framer) endWrite() error {
// ...
try n := f.w.Write(f.wbuf)
if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
๋๋ ๋ ๋ฒ์งธ @daved ์ ์๋ต์
๋๋ค. ๋ด ์๊ฐ์ @crawshaw ๊ฐ ๊ฐ์กฐ ํ์ํ ๊ฐ ์์ ๋ try
์ ๊ฒฐ๊ณผ๋ก ๋ ๋ช
ํํด์ง๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
try
(ํค์๋)๊ฐ ์ค์ ์์ ๋ถ๋ถ์ผ๋ก ์ด๋๋ ๋ง์ง๋ง ๋ช ๊ฐ์ ๊ฒ์๋ฌผ ๋ค์ ์ ์ง์์ ์ ๊ณตํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.return
์ ๊ฐ์ ์๊ฐ์ ๊ณต๊ฐ์ ๊ณต์ ํด์ผ ํฉ๋๋ค.
์ด ์ง์ ์ ๋ํ ๋ ๊ฐ์ง ์ต์ ์ด ์ฃผ์ด์ง๊ณ ํ๋๊ฐ ์ ํ๋์ด ๋ฏธ๋์ ์ ์ฌ์ ๊ธฐ๋ฅ์ ๋ํ ์ด๋ ์ ๋ ์ ๋ก๋ฅผ ์ค์ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
ใ .)
try f := os.Open(filepath) else err {
return errors.Wrap(err, "can't open")
}
๋น.)
f := try os.Open(filepath) else err {
return errors.Wrap(err, "can't open")
}
๋ ์ค ์ด๋ ๊ฒ์ด ํฅํ ์ ํค์๋ ์ฌ์ฉ์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๊น? _(์ปดํ์ผ๋ฌ ์์ฑ์ ์ด๋์ด ๊ธฐ์ ์ ๋ง์คํฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๋ต์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.)_ ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ๋ ์ ํ์ ์ผ ์ ์์ต๋๊น?
@davecheney @daved @crawshaw
๋๋ ์ด๊ฒ์ ๋ํด Daves์ ์๊ฒฌ์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. @crawshaw ์ ์์๋ ๋ค๋ฅธ ๋ง์ ์ผ์ด ์งํ๋๋ ๋ผ์ธ์ ๊น์ด ํฌํจ๋ ๋ง์ try
๋ฌธ์ด ์์ต๋๋ค. ์ถ๊ตฌ ์ง์ ์ ์ฐพ๊ธฐ๊ฐ ์ ๋ง ์ด๋ ต์ต๋๋ค. ๋ํ, try
๊ดํธ๋ ์ผ๋ถ ์์์ ์ํฉ์ ์๋นํ ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๊ฐ์ด ๋ณํ๋ stdlib ์ฝ๋ ๋ฌด๋ฆฌ๋ฅผ ๋ณด๋ ๊ฒ์ ๋งค์ฐ ์ ์ฉํ๋ฏ๋ก ๋์ผํ ์์ ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ ์ ํ์ ์ธ ๋์ฒด ์ ์์ ๋ฐ๋ผ ๋ค์ ์์ฑํ์ต๋๋ค.
try
๋ฅผ ํค์๋๋กtry
ํ๋๋งtry
๋ ์ค์ ์์ ๋ถ๋ถ์ ์์ด์ผ ํฉ๋๋ค.์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋น๊ตํ๋ ๋ฐ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ด ์์ ๋ ์๋ณธ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํด ๋ณด์ด์ง๋ง ์ ์ด ํ๋ฆ์ ๊ฐ๋ฆฌ์ง ์์ต๋๋ค. try
๋ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ณณ์์ ๋งค์ฐ ์ ๋ณด์
๋๋ค.
ํ ์คํธ/ํ ํ๋ฆฟ
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
lessOrEqual, err := le(arg1, arg2)
if err != nil {
return false, err
}
return !lessOrEqual, nil
}
๋ค์์ด ๋ฉ๋๋ค:
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
try lessOrEqual := le(arg1, arg2)
return !lessOrEqual, nil
}
ํ ์คํธ/ํ ํ๋ฆฟ
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
index, err := prepareArg(index, v.Type().Key())
if err != nil {
return reflect.Value{}, err
}
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
๋๋ค
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
try index := prepareArg(index, v.Type().Key())
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
์ ๊ท ํํ์/๊ตฌ๋ฌธ:
regexp/syntax/parse.go
func Parse(s string, flags Flags) (*Regexp, error) {
...
if c, t, err = nextRune(t); err != nil {
return nil, err
}
p.literal(c)
...
}
๋๋ค
func Parse(s string, flags Flags) (*Regexp, error) {
...
try c, t = nextRune(t)
p.literal(c)
...
}
๊ทธ๋ฌผ/http
net/http/request.go:readRequest
mimeHeader, err := tp.ReadMIMEHeader()
if err != nil {
return nil, err
}
req.Header = Header(mimeHeader)
๋ค์์ด ๋ฉ๋๋ค:
try mimeHeader := tp.ReadMIMEHeader()
req.Header = Header(mimeHeader)
๋ฐ์ดํฐ๋ฒ ์ด์ค/SQL
if driverCtx, ok := driveri.(driver.DriverContext); ok {
connector, err := driverCtx.OpenConnector(dataSourceName)
if err != nil {
return nil, err
}
return OpenDB(connector), nil
}
๋๋ค
if driverCtx, ok := driveri.(driver.DriverContext); ok {
try connector := driverCtx.OpenConnector(dataSourceName)
return OpenDB(connector), nil
}
๋ฐ์ดํฐ๋ฒ ์ด์ค/SQL
si, err := ctxDriverPrepare(ctx, dc.ci, query)
if err != nil {
return nil, err
}
ds := &driverStmt{Locker: dc, si: si}
๋๋ค
try si := ctxDriverPrepare(ctx, dc.ci, query)
ds := &driverStmt{Locker: dc, si: si}
๊ทธ๋ฌผ/http
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
cc, err := p.t.dialclientconn(addr, singleuse)
if err != nil {
return nil, err
}
return cc, nil
}
๋๋ค
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
try cc := p.t.dialclientconn(addr, singleuse)
return cc, nil
}
๊ทธ๋ฌผ/http
์ด๊ฒ์ ์ค์ ๋ก ์ฐ๋ฆฌ์๊ฒ ์ค์ ์ ์ฅํ์ง ์์ง๋ง if err == nil
๋ ๋น๊ต์ ๋๋ฌธ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ๋ช
ํํฉ๋๋ค.
func (f *http2Framer) endWrite() error {
...
n, err := f.w.Write(f.wbuf)
if err == nil && n != len(f.wbuf) {
err = io.ErrShortWrite
}
return err
}
๋๋ค
func (f *http2Framer) endWrite() error {
...
try n := f.w.Write(f.wbuf)
if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
๊ทธ๋ฌผ/http
if f, err := fr.ReadFrame(); err != nil {
return nil, err
} else {
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
๋๋ค
try f := fr.ReadFrame()
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
๊ทธ๋ฌผ:
if ctrlFn != nil {
c, err := newRawConn(fd)
if err != nil {
return err
}
if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
return err
}
}
๋๋ค
if ctrlFn != nil {
try c := newRawConn(fd)
try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
}
@james-lawrence https://github.com/golang/go/issues/32437#issuecomment -500116099์ ๋ํ ๋ต์ฅ : ์ ํ์ , err
์ ๊ฐ์ ์์ด๋์ด๊ฐ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ ค๋๊ณ ์๋์ง ๊ธฐ์ต๋์ง ์์ต๋๋ค. ์๋์. ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ํจ์๊ฐ ํํ error
๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋๋ก ๋ณ๊ฒฝ๋๋ฉด ๊ธฐ์กด ์ฝ๋๊ฐ ๊ณ์ ์ปดํ์ผ๋์ง๋ง ๋งค์ฐ ๋ค๋ฅด๊ฒ ์๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด defer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์๋ฏธ๊ฐ ์์ง๋ง ์ค๋ฅ์ ์ด๋ฆ๊ณผ ์๋ก์ด ์ข
๋ฅ์ if err != nil
์์ฉ๊ตฌ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
์ธ๋ถ ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
func handler(err *error) {
if *err != nil {
*err = handle(*err)
}
}
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
defer handler(&err)
์ธ๋ถ ํธ๋ค๋ฌ๋ ํ ๋ฒ๋ง ์์ฑํ๋ฉด ๋์ง๋ง ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ ๊ฐ์ง ๋ฒ์ ์ด ํ์ํฉ๋๋ค. ํ๋๋ ์ง์ฐ๋๊ณ ๋ค๋ฅธ ํ๋๋ ์ผ๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋ด๋ถ ์ฒ๋ฆฌ๊ธฐ๋ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
defer func() {
if err != nil {
err = handle(err)
}
}()
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ๋ถ ํจ์์ ์ค๋ฅ์ ์ก์ธ์คํ๋ ค๋ฉด ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ค๋ ๋์ ์๋ถ๋ถ์์ ์ธ๊ธํ๋ฏ์ด ์ด๊ฒ์ ๋จ์ผ ํจ์๋ก ์ถ์ํ๋ ์ ์์ต๋๋ค.
func catch(err *error, handle func(error) error) {
if *err != nil && handle != nil {
*err = handle(*err)
}
}
์ด๋ nil
ํธ๋ค๋ฌ ํจ์์ ๋ชจํธ์ฑ์ ๋ํ @griesemer ์ ์ฐ๋ ค์ ์์ถฉ๋๋ฉฐ err
์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ ๊ฒ ์ธ์๋ ์์ฒด defer
๋ฐ func(err error) error
์์ฉ๊ตฌ๊ฐ ์์ต๋๋ค. err
๋ ์ธ๋ถ ํจ์์ ์์ต๋๋ค.
try
๊ฐ ํค์๋๋ก ๋๋๋ ๊ฒฝ์ฐ ์๋์ ์ค๋ช
๋ catch
ํค์๋๋ ์๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ์ handle
์ ๋น์ทํฉ๋๋ค.
catch err {
return handleThe(err)
}
์๋ฏธ์ ์ผ๋ก ์์ ๋ด๋ถ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ๋ํ ์คํ์ด ๋ฉ๋๋ค.
defer func() {
if err != nil {
err = handleThe(err)
}
}()
๋ค์ ๋ง์ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ์๋ ์ธ๋ถ ํจ์์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์ต๋๋ค. ($# catch
err
๋ค์ err๋ catch
๋ธ๋ก์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊ณผ ๋น์ทํฉ๋๋ค.)
catch
๋ try
์ ๋์ผํ ์ ํ์ ๊ฐ์ง๋ฉฐ ์ต์ข
์ค๋ฅ ๋ฐํ์ด ์๋ ํจ์์ ์์ด์ผ ํฉ๋๋ค. ๋ ๋ค ๊ทธ๊ฒ์ ์์กดํ๋ ์คํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ ์๋์ handle
์ ์๋งํผ ๊ฐ๋ ฅํ์ง๋ ์์ง๋ง ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๋ฅ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์์ ๊ณ ๋ด๋ถ ์ฒ๋ฆฌ๊ธฐ์ ๋ํด ์์์ ๋
ผ์ํ ์๋ก์ด ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๋ ๋์์ ์ธ๋ถ ์ฒ๋ฆฌ๊ธฐ์ ๋ํด ๋ณ๋์ ๋ฒ์ ์ ํจ์๊ฐ ํ์ํฉ๋๋ค.
๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๋ try
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก catch
๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํฉ๋๋ค.
๋ ๋ค ์คํ์ด๋ฏ๋ก try
catch
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. catch
ํธ๋ค๋ฌ๋ ํจ์๊ฐ nil
๊ฐ ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ ๋๋ง๋ค ์คํ๋๋ฉฐ, ์๋ฅผ ๋ค์ด ๋น ๋ฅธ ๋ก๊น
์ ๊ณ์ํ ์ ์์ต๋๋ค.
catch err {
log.Print(err)
return err
}
๋๋ ๋ฐํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ํํฉ๋๋ค.
catch err {
return fmt.Errorf("foo: %w", err)
}
@ianlancetaylor
_" ํํ
error
๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ํจ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ธฐ์กด ์ฝ๋๊ฐ ๊ณ์ ์ปดํ์ผ๋์ง๋ง ๋งค์ฐ ๋ค๋ฅด๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ์๋ชป๋ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค."_
์ ์คํธ๋ฆผ ์ฝ๋์ ๋ค์ด์คํธ๋ฆผ ์ฝ๋๋ฅผ ๋ชจ๋ ์ ์ดํ ์ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ํจ์ ์๋ช ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์์ ์ ํจํค์ง์ ์ ์คํธ๋ฆผ์ด๋ ๋ค์ด์คํธ๋ฆผ์ ์ ์ดํ์ง ์์ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์๊ฐํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋ํ ์ค๋ฅ๊ฐ ์ถ๊ฐ๋ ์ ์๋ ์ฌ์ฉ ์ฌ๋ก์ ์ค๋ฅ๋ฅผ ์ถ๊ฐํด์ผ ํ์ง๋ง ๋ค์ด์คํธ๋ฆผ ์ฝ๋๋ฅผ ๊ฐ์ ๋ก ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋๊ตฐ๊ฐ๊ฐ ์๋ช ์ ๋ณ๊ฒฝํ์ฌ ๋ฐํ ๊ฐ์ ์ถ๊ฐํ๋ ์๋ฅผ ์๊ฐํ ์ ์์ต๋๊น? ์ ์๊ฒ ๊ทธ๋ค์ ์ผ๋ฐ์ ์ผ๋ก _"์ค๋ฅ๊ฐ ๋ฐ์ํ ์ค ๋ชฐ๋์ต๋๋ค"_ ๋๋ _"๊ฒ์ผ๋ฆ์ ๋๋ผ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ ธ๋ ฅํ๊ณ ์ถ์ง ์์ต๋๋ค."์ ๋ฒ์ฃผ์ ์ํฉ๋๋ค. _
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ์ด ๋ถ๋ช ํด์ง๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๋ฐํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ด ๋ ๋ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์์ ํธํ์ฑ์ ๊นจ๊ณ ์ถ์ง ์์ ์๋ช ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ๋ด ์๊ฐ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ func๋ฅผ ํธ์ถํ ์ฝ๋๋ _์ด์จ๋ ._ ๋งค์ฐ ๋ค๋ฅด๊ฒ ์๋ํ ๊ฒ์ ๋๋ค.
์ฌ์ค ๋๋ ํ์๋ฅผ ๊ฑฐ์ ํ์ง ์์ง๋ง ์ ์๋ ๋๋ฌด ์์ฃผ ํ๋ค. ํ์ง๋ง ํ์ฌ ํจํค์ง๊ฐ ์์ด์ผ ํ ์์น์์ ์บก์ฒ ์ค๋ฅ๋ฅผ ์์ฃผ ๋ฌด์ํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๊ณ , GoLand์ ์ฝ๋๋ฅผ ๋ชจ๋ ์ธ์คํด์ค์ ๋ฐ์ ์ฃผํฉ์์ผ๋ก ํ์ํ ๋ ์ด๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด๊ฐ ๋ง์ด ์ฌ์ฉํ๋ ํจํค์ง์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด pull ์์ฒญ์ ์ ์ถํ ์ ์๊ธฐ๋ฅผ ์ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋ฝํ์ง ์์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๋ด๊ฐ ๊ทธ๋ค์ ์ฝ๋ ์๋ช ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํจ์์์ ๋ฐํํ ์ค๋ฅ๋ฅผ ์ถ๊ฐํ๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์์ผ๋ก์จ ์ฝ๋๋ฅผ ๋ฐฐํฌํ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ์์๋์ง ์๋๋ก ํ๋ ๊ฐ๋ฐ์๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ๋๋ก ํจํค์ง๋ฅผ ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค.
์ฝ๋๊ฐ ๋ค๋ฅด๊ฒ ์๋ํ๋ค๋ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋ณด๋ค๋ ๋ฌธ์ ๋ฅผ ๋ฅ๋์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์บก์ฒํ์ง ์๋ ๋ฉ์๋์ ๋จ์ ์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ์์ง๋์ด๋ง ๋ฌธ์ ๋ก ๋ณผ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ ๋ ๊ด๋ฒ์ํ๊ณ ์ฅ๊ธฐ์ ์ธ ๊ฐ์น๋ฅผ ๊ฐ์ง ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์๊ธฐ ์ ์ ์ค์ ํด์ผ ํ๋ ํจํค์ง ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์๊ฒ ์ต๋๊น?
์์งํ ๋งํด์, ์ ๊ธฐ์ ์ธ ๋ฐํ ๊ฐ์ ์ถ๊ฐํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ Go์ ๊ด์ฉ๊ตฌ๋ ๋ ๋์ ํ์ ์ค ํ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ ํ ๋ ์ข ์ข ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์ฝ์ ์ ๋ ธ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ Go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ถฉ๋ถํ ํ์ ์ ์ด์ง ๋ชปํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
์ฐ๋ฆฌ Gophers๋ ์์ธ๋ฅผ ๋์ง๊ธฐ ๋ณด๋ค๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ฐ ๋ชฐ๋ํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋์ ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ง๋ฌธ์ _"์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ํจ์์์ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์์์ผ ํฉ๋๊น?"_ ์ค๋ฅ ์ฒ๋ฆฌ ์์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํญ์ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๊ฒ์ผ๋ก ์ฝ๋ฉํ๋ ๊ฒ๋ณด๋ค ๋ ํธ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ค๋ฅ ์ฒ๋ฆฌ์์ ๋ฒ์ด๋ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์๋ตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ข ์ข ์ฐ๋ฆฌ๋ ์๋ชป ์ถ์ธกํฉ๋๋ค.
๊ทธ๋์ ์ ๋ง๋ก, ์ฝ๋๋ฅผ ์ฐ์ํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์๋ค๋ฉด ๋ฐํ ๊ฐ๊ณผ ์ค๋ฅ๋ ์ค์ ๋ก ๋ณ๋๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๊ณ _every_ ํจ์๋ ๊ณผ๊ฑฐ ํจ์ ์๋ช ์ ๊ด๊ณ์์ด ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ป๋ ๊ฒ์ ๊ฐ์น ์๋ ๋ ธ๋ ฅ์ด ๋ ๊ฒ์ ๋๋ค.
๋๋ ์คํ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ์ ์์ํ ์ ์์๊ธฐ ๋๋ฌธ์ ์๋ฌด ๊ฒ๋ ์ ์ํ์ง ์์์ง๋ง, ์ฐ๋ฆฌ ์ค์ค๋ก์๊ฒ ์ ์งํ๊ณ ์ถ๋ค๋ฉด ์ด ์ค๋ ๋์ ๋ชจ๋ ๊ฒ๊ณผ ์ผ๋ฐ์ ์ผ๋ก Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๊ฒ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ํ๋ก๊ทธ๋จ ๋ก์ง์ด ์ด์ํ ๋๋ฃ๋ค์ด๋ฏ๋ก ์ด์์ ์ผ๋ก๋ ์ค๋ฅ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๋์ญ ์ธ์์ ๊ฐ์ฅ ์ ์ฒ๋ฆฌ๋ ๊ฒ์ ๋๊น?
try
ํค์๋๋ ํ์คํ ๊ฐ๋
์ฑ(ํจ์ ํธ์ถ ๋๋น)์ ๋์์ด ๋๋ฉฐ ๋ ๋ณต์กํด ๋ณด์
๋๋ค. @brynbellomy @crawshaw ์๊ฐ์ ๋ด์ด ์์ ๋ฅผ ์์ฑํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๋ด ์ผ๋ฐ์ ์ธ ์๊ฐ์ try
๊ฐ ๋๋ฌด ๋ง์ ์ผ์ ํ๋ค๋ ๊ฒ์
๋๋ค. ํจ์ ํธ์ถ, ๋ณ์ ํ ๋น, ์ค๋ฅ ํ์ธ ๋ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐํ์ ํด๊ฒฐํฉ๋๋ค. ๋๋ ๋์ ๋ฒ์๋ฅผ ์ค์ด๊ณ ์กฐ๊ฑด๋ถ ๋ฐํ์ ๋ํด์๋ง ํด๊ฒฐํ ๊ฒ์ ์ ์ํฉ๋๋ค. "๋ง์ง๋ง ์ธ์๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ ๋ฐํ".
์ด๊ฒ์ ์๋ง๋ ์๋ก์ด ์๊ฐ์ด ์๋ ๊ฒ์ ๋๋ค... ๊ทธ๋ฌ๋ ์ค๋ฅ ํผ๋๋ฐฑ ์ํค ์์ ์ ์์ ํ์ด๋ณธ ํ, ๋๋ ๊ทธ๊ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค(๊ทธ๊ฒ์ด ๊ฑฐ๊ธฐ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค)
์กฐ๊ฑด๋ถ ๋ฐํ์ ๋ํ ๋ฏธ๋ ์ ์
๋ฐ์ท:
err, thing := newThing(name)
refuse nil, err
์ํค์๋ "๋์ ์์ด๋์ด"์ ์ถ๊ฐํ์ต๋๋ค.
์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ๋ ๋งค์ฐ ํฉ๋ฆฌ์ ์ธ ์ ํ์ผ๋ก ๋ณด์ ๋๋ค.
@alexhornbake ๋ ์ ์ฉํ ์ฝ๊ฐ ๋ค๋ฅธ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
assert(nil, err)
assert(len(a), len(b))
assert(true, condition)
assert(expected, given)
์ด ๋ฐฉ๋ฒ์ ์ค๋ฅ ๊ฒ์ฌ์๋ง ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ๋ง์ ์ ํ์ ๋ ผ๋ฆฌ ์ค๋ฅ์ ์ ์ฉ๋ฉ๋๋ค.
์ฃผ์ด์ง ๊ฒ์ ์ค๋ฅ๋ก ๋ํ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
@alexhornbake
try
์ด ์ค์ ๋ก ์๋ํ์ง ์๋ ๊ฒ์ฒ๋ผ refuse
๋ ์ค์ ๋ก "๊ฑฐ๋ถ"ํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ผ๋ฐ์ ์ธ ์๋๋ ์ฐ๊ฒฐ๋ ๊ฐ ์ค ํ๋๊ฐ ์กฐ๊ฑด์ ์ถฉ์กฑํ ๋ "ํธ๋ฆฝ"ํ๋ "๋ณดํธ ๊ณ์ ๊ธฐ"( relay
์ ์งง๊ณ ์ ํํ๋ฉฐ return
์ ๋์ด ์ ์)๋ฅผ ์ค์ ํ๋ค๋ ๊ฒ์
๋๋ค. (์ฆ, nil์ด ์๋ ์ค๋ฅ). ์ผ์ข
์ ํ๋ก ์ฐจ๋จ๊ธฐ์ด๋ฉฐ, ๋์์ธ์ด ํฅ๋ฏธ๋กญ์ง ์์ ๊ฒฝ์ฐ๋ก ์ ํ๋์ด ๊ฐ์ฅ ๋ฎ์ ์์ฉ๊ตฌ๋ฅผ ๋จ์ํ ์ค์ด๊ธฐ ์ํด ๊ฐ์น๋ฅผ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๊ฒฉ์ผ๋ก ๋ณต์กํ ๋ชจ๋ ๊ฒ์ ์ผ๋ฐ Go ์ฝ๋์ ์์กดํด์ผ ํฉ๋๋ค.
๋๋ ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํด๋ณด๋ ๊ทธ์ ์์ ์ ๋ํด cranshaw๋ฅผ ์นญ์ฐฌํ์ง๋ง, ๋๋ ๋งค์ฐ ๋ค๋ฅธ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค... ๊ฑฐ์ ๋ชจ๋ ์ฝ๋ ์กฐ๊ฐ์ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ๋ ์คํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
req.Header = Header(try(tp.ReadMIMEHeader())
๋๋ ์ด๊ฒ์ด ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ์ฌ์ค์ ์์ฃผ ๊ทธ๋ฆฌ์ํ ๊ฒ์ ๋๋ค. ๋น ๋ฅธ ์ฝ๊ธฐ๋ "ํ์ธ, ํค๋๋ฅผ ReadMimeHeader์ ํค๋๋ก ์ค์ "ํฉ๋๋ค.
if driverCtx, ok := driveri.(driver.DriverContext); ok {
return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
}
์ด ํ๋, ๋ด ๋์ ๊ทธ OpenDB ๋ผ์ธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ค๊ณ ๊ต์ฐจํฉ๋๋ค. ๊ฑฐ๊ธฐ์๋ ๋๋ฌด ๋ง์ ๋ฐ๋๊ฐ ์์ต๋๋ค ... ์ด๊ฒ์ ๋ชจ๋ ์ค์ฒฉ ํจ์ ํธ์ถ์ด ๊ฐ์ง๊ณ ์๋ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ด๋ถ์์ ์ธ๋ถ๋ก ์ฝ์ด์ผํ๊ณ ๊ฐ์ฅ ์์ชฝ ๋ถ๋ถ์ด ์ด๋์ ์๋์ง ํ์ ํ๊ธฐ ์ํด ๋จธ๋ฆฌ์์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผํ๋ค๋ ์ ์์ .
๋ํ ์ด๊ฒ์ ๊ฐ์ ์ค์ ์๋ก ๋ค๋ฅธ ๋ ์์น์์ ๋ฐํ๋ ์ ์์ต๋๋ค. . ๋น์ ์ ๋๋ฒ๊น ์ ํ๊ฒ ๋ ๊ฒ์ด๊ณ , ์ด ์ค์์ ์ค๋ฅ๊ฐ ๋ฐํ๋์๋ค๋ ๋ฉ์์ง๊ฐ ํ์๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ๊ฐ์ฅ ๋จผ์ ํ ์ผ์ OpenDB๊ฐ ์ด ์ด์ํ ์ค๋ฅ์ ํจ๊ป ์คํจํ๋ ์ด์ ๋ฅผ ์์๋ด์ญ์์ค. ์ค์ ๋ก OpenConnector๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ(๋๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค).
ds := &driverStmt{
Locker: dc,
si: try(ctxDriverPrepare(ctx, dc.ci, query)),
}
์ด๊ฒ์ ์ด์ ์๋ ๋ถ๊ฐ๋ฅํ๋ ์ฝ๋๊ฐ ์คํจํ ์ ์๋ ๊ณณ์
๋๋ค. try
๊ฐ ์์ผ๋ฉด ๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด ์์ฑ ์ด ์คํจํ ์ ์์ต๋๋ค . ๋ด ๋์ "์ข์, driverStmt ๊ตฌ์ฑ ์ค ... ๊ณ์ .."์ฒ๋ผ ํ์ด๋ณด๊ณ ์ค์ ๋ก ๊ทธ๊ฒ์ ๋์น๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ํจ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด์ ์ ๊ฐ๋ฅํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ctxDriverPrepare๊ฐ ํจ๋ ์ํ์ ๋น ์ง๋ ๊ฒ์
๋๋ค... ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ๋ชจ๋๋ ๊ทธ๊ฒ์ด 1.) ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ํด์๋ ์ ๋๋ฉฐ 2.) ๋ฐ์ํ๋ค๋ฉด, ๋ญ๊ฐ ํฌ๊ฒ ์๋ชป๋์์์ ์๋ฏธํฉ๋๋ค.
ํค์๋์ ๋ฌธ์ฅ์ ์๋ํ๋ฉด ๋ด ๋ฌธ์ ๊ฐ ๋ง์ด ํด๊ฒฐ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ ๋์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@daved ํ๋ก์ฐํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ฆ์ด ๋ง์์ ๋ค์ง ์๊ฑฐ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์์ต๋๊น?
์ด์จ๋ , ๋๋ ์ด๊ฒ์ ๋์์ผ๋ก ์ฌ๊ธฐ์ ๊ฒ์ํ์ต๋๋ค ... ํฉ๋ฒ์ ์ธ ๊ด์ฌ์ด ์๋ค๋ฉด ํ ๋ก ์ ์ํด ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค.์ด ์ค๋ ๋๋ฅผ ์ค์ผ์ํค๊ณ ์ถ์ง ์์ต๋๋ค (์๋ง๋ ๋๋ฌด ๋ฆ์์ต๋๊น?) ์๋ ์์ด๋์ด์ ๋ํ ์์ง ์๊ฐ๋ฝ์ด ์ค ๊ฒ์ ๋๋ค ์ฐ๋ฆฌ ์๋ฏธ... ๋ฌผ๋ก ๋ค๋ฅธ ์ด๋ฆ์ ์ด๋ ค ์์ต๋๋ค. ์ค์ํ ๋ถ๋ถ์ "ํ ๋น ์ฒ๋ฆฌ๋ฅผ ์๋ํ์ง ์๊ณ ์กฐ๊ฑด๋ถ ๋ฐํ"์ ๋๋ค.
@jimmyfrasche ์ ์บ์น ์ ์ ์ด ๋ง์์ ๋ค์ง๋ง ๋์์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
go
handler fmt.HandleErrorf("copy %s %s", src, dst)
๋ค์๊ณผ ๊ฐ์ต๋๋ค.
go
defer func(){
if(err != nil){
fmt.HandleErrorf(&err,"copy %s %s", src, dst)
}
}()
์ฌ๊ธฐ์ err์ ์ ํ ์ค๋ฅ๊ฐ ์๋ ๋ง์ง๋ง์ผ๋ก ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ ๊ฐ์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ํ์ฉ๋ฉ๋๋ค.
go
handler func(err *error){ *err = fmt.Errorf("foo: %w", *err) }() `
๋ช
๋ช
๋ ๋ฐํ ๊ฐ(catch๋ก ํด๊ฒฐ๋์ง ์์)์ ์ฌ์ฉํ ๋์ ์ฃผ์ ๋ฌธ์ ๋ err์ด ๋ถํ์ํ๋ค๋ ๊ฒ์
๋๋ค. fmt.HandleErrorf
์ ๊ฐ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ํธ์ถ์ ์ฐ๊ธฐํ ๋ ์ค๋ฅ ๋ฐํ ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๊ณ ํฉ๋ฆฌ์ ์ธ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์์๊ฒ ์ค์๋ฅผ ํ ์ ์๋ ์ต์
์ ์ ๊ณตํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
catch์ ๋น๊ตํ์ฌ ์ฃผ์ ์ฐจ์ด์ ์ ํธ๋ค๋ฌ๊ฐ ๋ฏธ๋ฆฌ ์ ์๋ ํธ๋ค๋ฌ๋ฅผ ์ ์๋ฆฌ์ ์ ์ํ๊ธฐ ์ํด ๋ ์ฅํฉํ๊ฒ ๋ง๋๋ ๋์ ๋ฏธ๋ฆฌ ์ ์๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ ์ฝ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ด์์ ์ด๋ผ๊ณ ํ์ ํ ์๋ ์์ง๋ง ์๋ ์ ์์ ๋ ๋ถํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@yiyus catch
, ์ ์ํ ๋๋ก catch
๋ฅผ ํฌํจํ๋ ํจ์์ err
์ด๋ฆ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
catch err {
์์ err
๋ catch
๋ธ๋ก ๋ด ์์ ์ด๋ฆ์ด ์ง์ ๋ ์ค๋ฅ์
๋๋ค. ํจ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๊ฒ์ผ๋ก fmt.HandleErrorf
fmt.Errorf
๊ฐ์ ๊ฒ์ ํ์ํ์ง ์์ต๋๋ค.
func f() error {
catch err {
return fmt.Errorf("foo: %w", err)
}
return errors.New("bar")
}
foo: bar
๋ก ์ธ์ํ๋ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค.
try()
ํจ์ ํธ์ถ์ ์์ ํจ์์์ ์ฝ๋ ์คํ์ ์ค๋จํฉ๋๋ค.return
ํค์๋๋ ์์ง๋ง ์ฝ๋๊ฐ ์ค์ ๋ก ๋ฐํ๋ฉ๋๋ค.ํธ๋ค๋ฌ๋ฅผ ์ํํ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์ ์๋๊ณ ์์ง๋ง ๋ ๊ฐ์ง ํต์ฌ ์๊ตฌ ์ฌํญ์ ๋์น๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค.
if x, err := thingie(); err != nil { handle(err) }
์ ์๋นํ ๋ค๋ฅด๊ณ ๋ ์ข์์ผ ํฉ๋๋ค. try x := thingie else err { handle(err) }
๋ผ์ธ์ ๋ฐ๋ฅธ ์ ์์ ๊ทธ ๊ธฐ์ค์ ๋ถํฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฅ if
๋ผ๊ณ ํ์ง ์๊ฒ ์ต๋๊น?
defer
์ ๊ธฐ์กด ๊ธฐ๋ฅ๊ณผ ์ง๊ตํด์ผ ํฉ๋๋ค. ์ฆ, ํธ๋ค๊ณผ ์ง์ฐ์ด ์ํธ ์์ฉํ ๋ ์ด์ํ ์ฝ๋ ์ผ์ด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ์ ์๋ ํธ๋ค๋ง ๋ฉ์ปค๋์ฆ์ด ๊ทธ ์์ฒด๋ก ํ์ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํ ๋งํผ ์ถฉ๋ถํ ๋ฌ๋ผ์ผ ํฉ๋๋ค.
try
/handle์ ๋ํ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ๋
ผ์ํ ๋ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ์ผ๋์ ๋์ญ์์ค.
@carlmjohnson ์์ 2์ ๋ํ @jimmyfrasche ์ catch
์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. defer
์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ผ ๋ฟ์ด๋ฏ๋ก 2์ค์ ์ ์ฝํ๊ณ ์ค๋ฅ ๋ฐํ ๊ฐ์ ์ด๋ฆ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ํ ์์ง ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค. defer
์ด๊ธฐ ๋๋ฌธ์ defer
์ ์ง๊ต์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค.
@ubombi ๊ฐ ๋งํ ๋ด์ฉ์ ๋ฐ์ํฉ๋๋ค.
try() ํจ์ ํธ์ถ์ ์์ ํจ์์์ ์ฝ๋ ์คํ์ ์ค๋จํฉ๋๋ค.; return ํค์๋๋ ์์ง๋ง ์ฝ๋๋ ์ค์ ๋ก ๋ฐํํฉ๋๋ค.
Ruby์์ procs์ lambdas๋ try
๊ฐ ํ๋ ์ผ์ ํ ์์
๋๋ค... proc์ return ๋ฌธ์ด ๋ธ๋ก ์์ฒด๊ฐ ์๋๋ผ ํธ์ถ์๋ก๋ถํฐ ๋ฐํํ๋ ์ฝ๋ ๋ธ๋ก์
๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก try
๊ฐ ํ๋ ์ผ์
๋๋ค... ๊ทธ๋ฅ ๋ฏธ๋ฆฌ ์ ์๋ Ruby proc์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ธธ์ ๊ฐ๋ค๋ฉด ์ค์ ๋ก proc functions
๋ฅผ ๋์
ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ ์ try
ํจ์๋ฅผ ์ ์ํ๋๋ก ํ ์ ์์ ๊ฒ์
๋๋ค.
๋๋ ์ฌ์ ํ if err != nil
๋ฅผ ์ ํธํ๋๋ฐ ๊ฐ๋
์ฑ์ด ๋ ๋์ง๋ง ์ฌ์ฉ์๊ฐ ์์ ์ proc์ ์ ์ํ๋ค๋ฉด try
๊ฐ ๋ ์ ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
proc try(err *error, msg string) {
if *err != nil {
*err = fmt.Errorf("%v: %w", msg, *err)
return
}
}
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅผ ์ ์์ต๋๋ค.
func someFunc() (string, error) {
err := doSomething()
try(&err, "someFunc failed")
}
์ฌ๊ธฐ์์ ์ด์ ์ ์์ ์ ์ฉ์ด๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ proc
๋ฅผ ๋
ธ์ถ, ๋น๊ณต๊ฐ ๋๋ ๋ด๋ถ๋ก ๋ง๋ค ์๋ ์์ต๋๋ค.
๋ํ ๊ฐ ํจ์๊ฐ ์๋ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ๋ํด ํ ๋ฒ๋ง ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ Go2 ์ ์์ handle {}
์ ๋ณด๋ค ๋ซ์ต๋๋ค.
๊ฐ๋
์ฑ์ ๋ํ ํ ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ์ func() ๋ฐ proc()์ด func()
๋ฐ proc!()
์ ๊ฐ์ด ๋ค๋ฅด๊ฒ ํธ์ถ๋์ด ํ๋ก๊ทธ๋๋จธ๊ฐ proc ํธ์ถ์ด ์ค์ ๋ก ๋ฐํ๋ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ํธ์ถ ๊ธฐ๋ฅ.
@marwan-at-work, ๊ทํ์ ์์์ try(err, "someFunc failed")
๊ฐ try(&err, "someFunc failed")
๊ฐ ์๋์ด์ผ ํฉ๋๊น?
@dpinela ์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค :)
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์์ ์ฌ์ ์ํ๋ ค๊ณ ํ๋ ์ผ๋ฐ์ ์ธ ๊ดํ์ ๋ง์ ์ธ์ด์ ๊ฑธ์ณ ํด์ ๋๋ ํ์ค ์คํ์ด ์์ธ์์ ์ ์ํ๋ ๊ฒ์
๋๋ค(๋ฐ๋ผ์ "์๋"๋ผ๋ ๋จ์ด๊ฐ ์ ํ๋์์ต๋๋ค...).
๊ทธ๋ฌ๋ ์ถ์ ์์ ๋ ์์ค ๋ค๋ก ์ ํํ๋ ํจ์(...try() ๋๋ ๊ธฐํ)๋ง ํ์ฉํ ์ ์๋ค๋ฉด
try := handler(err error) { //which corelates with - try := func(err error)
if err !=nil{
//do what ever you want to do when there's an error... log/print etc
return2 //2 levels
}
}
๋ค์๊ณผ ๊ฐ์ ์ฝ๋
f := try(os.Open(ํ์ผ ์ด๋ฆ))
์ ์์ด ์กฐ์ธํ๋ ๋๋ก ์ ํํ๊ฒ ์ํํ ์ ์์ง๋ง ํจ์(๋๋ ์ค์ ๋ก "ํธ๋ค๋ฌ ํจ์")๋ก์ ๊ฐ๋ฐ์๋ ํจ์๊ฐ ํ๋ ์ผ, ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ค๋ฅ ํ์์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ํจ์ฌ ๋ ๋ง์ ์ ์ด ๊ถํ์ ๊ฐ๊ฒ ๋๋ฉฐ, ์ ์ฌํ ํธ๋ค๋ฌ๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋งค๋ฒ fmt.Errorf("error opening file %s ....")๋ฅผ ์์ฑํ๋ ๋์ os.Open์ ์ฒ๋ฆฌํ ์ฝ๋(๋งํ์๋ฉด).
์ด๊ฒ์ ๋ํ "try"๊ฐ ์ ์๋์ง ์์ ๊ฒ์ฒ๋ผ ๊ฐ์ ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ์
๋๋ค.
@guybrand ์ด๋ฌํ 2๋จ๊ณ ๋ฐํ return2
(๋๋ Smalltalk์์ ์ผ๋ฐ์ ์ธ ๊ฐ๋
์ด "๋น๋ก์ปฌ ๋ฐํ"์ด๋ผ๊ณ ํจ)์ ๊ฐ๋ ๊ฒ์ ์ข์ ๋ฒ์ฉ ๋ฉ์ปค๋์ฆ์ด ๋ ๊ฒ์
๋๋ค(๋ํ #32473์์ @mikeschinkel ์ด ์ ์ํจ) . ํ์ง๋ง try
์ด(๊ฐ) ๊ทํ์ ์ ์์ ์ฌ์ ํ ํ์ํ ๊ฒ ๊ฐ์ผ๋ฏ๋ก return2
์ ๋ํ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค. try
๋ return
๋ฅผ ์ํํ ์ ์์ต๋๋ค. try
๋ฅผ ์ธ ์๋ ์์ผ๋ฉด ๋ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ด์ง๋ง ์์์ ์๋ช
์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@griesemer
_"
return2
์ ๋ํ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.try
๋return
๋ฅผ ํ ์ ์์ต๋๋ค."_
ํ ๊ฐ์ง ์ด์ ๋ โ #32473 _(์ฐธ๊ณ ์ ๊ฐ์ฌํฉ๋๋ค)_ โ return
์ธ์๋ break
๋ฐ continue
์ ์ฌ๋ฌ ์์ค์ ํ์ฉํ๋ ๊ฒ์
๋๋ค.
์๋ก์ด ์๊ฒฌ์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ ๋ก ์ ๋ฐ๋ผ์ก๊ณ ๊ด๋ฒ์ํ ํผ๋๋ฐฑ์ ์์ฑํ๋ ๊ฒ์ ์๋นํ ์๊ฐ ํฌ์์ ๋๋ค. ๋๋ก๋ ์ด๋ ฌํ ๋ ผ์์๋ ๋ถ๊ตฌํ๊ณ ์ด๊ฒ์ ์ง๊ธ๊น์ง ๋ค์ ์๋ฏผ์ ์ธ ์ค๋ ๋์์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ๋น ๋ฅธ ์์ฝ์ด ์์ต๋๋ค. ์ด๋ฒ์๋ ์ข ๋ ์์ถ๋์์ต๋๋ค. ๋ด๊ฐ ์ธ๊ธํ์ง ์์๊ฑฐ๋, ์์๊ฑฐ๋, ์๋ชป ํํํ ์ฌ๋๋ค์๊ฒ ์ฌ๊ณผํฉ๋๋ค. ์ด ์์ ์์ ๋ช ๊ฐ์ง ๋ ํฐ ์ฃผ์ ๊ฐ ๋ฑ์ฅํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
1) ์ผ๋ฐ์ ์ผ๋ก try
๊ธฐ๋ฅ์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ชป๋ ์ ํ์ผ๋ก ๋๊ปด์ง๋๋ค. ์ ์ด ํ๋ฆ์ ์ํฅ์ ๋ฏธ์น๋ค๋ ์ ์ ๊ฐ์ํ ๋ _์ ์ด๋_ ํค์๋์ฌ์ผ ํฉ๋๋ค( @carloslenz ๋ " ๊ดํธ"); try
ํํ์์ ์ข์ ์๊ฐ์ด ์๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ๊ฐ๋
์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ฉฐ( @ChrisHines , @jimmyfrasche) " return
์์ด ๋ฐํ"๋ฉ๋๋ค. @brynbellomy ๋ ์๋ณ์๋ก ์ฌ์ฉ๋ try
์ ์ค์ ๋ถ์ ์ ์ํํ์ต๋๋ค. ๋ฐฑ๋ถ์จ ๊ธฐ์ค์ผ๋ก ๋งค์ฐ ์ ์ ๊ฒ์ผ๋ก ๋ํ๋ ๋๋ฌด ๋ง์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํค์๋ ๊ฒฝ๋ก๋ก ์ด๋ํ ์ ์์ต๋๋ค.
2) @crawshaw ๋ std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์๋ฐฑ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก ๋ฅผ ๋ถ์ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ๊ณ ์ ์๋ try
๊ฐ ๊ฑฐ์ ํญ์ ๊ฐ๋
์ฑ์ ํฅ์์ํจ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. @jimmyfrasche ๋ ๋ฐ๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค.
3) ๋ ๋ค๋ฅธ ์ฃผ์ ๋ ์ค๋ฅ ์ฅ์์ defer
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์์ ์ด์ง ์๋ค๋ ๊ฒ์
๋๋ค. @josharian ์ defer
๊ฐ ํญ์ ํจ์ ๋ฐํ ์ ์คํ๋์ง๋ง ์ค๋ฅ ์ฅ์์ ์ํด ์ฌ๊ธฐ์ ์๋ ๊ฒฝ์ฐ ํผ๋์ ์์ธ์ด ๋ ์ ์๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋ณธ์ฒด์ ์ ๊ฒฝ์ ์ด๋ค๊ณ ์ง์ ํฉ๋๋ค.
4) ์ ์์ ๊ฐ์ ํ๊ธฐ ์ํ ์ ์์ ๋ง์ด ์์ฑํ์ต๋๋ค. @zeebo , @patrick-nyt๋ gofmt
๋ฅผ ํ ์ค์ ๊ฐ๋จํ if
$ ํ์์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค(ํ์ฌ ์ํ์ ๋ง์กฑํฉ๋๋ค). @jargv ๋ try()
(์ธ์ ์์ด)๊ฐ ํ์ฌ "๋ณด๋ฅ ์ค์ธ" ์ค๋ฅ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ ์ ์๋ค๊ณ ์ ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด defer
์์ ์ก์ธ์คํ ์ ์๋๋ก ์ค๋ฅ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. @masterada ๋ ๋์ errorfunc()
์ฌ์ฉ์ ์ ์ํ์ต๋๋ค. @velovix ๋ 2-argument try
์ ์์ด๋์ด๋ฅผ ๋์ด๋ ค ๋ ๋ฒ์งธ ์ธ์๊ฐ ์ค๋ฅ ํธ๋ค๋ฌ๊ฐ ๋ ๊ฒ์
๋๋ค.
@klaidliadon , @networkimprov ๋ try
f, # := os.Open()
์ ๊ฐ์ ํน์ "ํ ๋น ์ฐ์ฐ์"๋ฅผ ์ ํธํฉ๋๋ค. @networkimprov ๋ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์กฐ์ฌํ๋ ๋ณด๋ค ํฌ๊ด์ ์ธ ๋์ ์ ์์ ์ ์ถํ์ต๋๋ค(๋ฌธ์ #32500 ์ฐธ์กฐ). @mikeschinkel ์ ๋ํ ์ค๋ฅ ๊ด๋ จ try
๊ฐ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ์๋ ์ฌ์ฉํ ์ ์๋ ๋ ๊ฐ์ง ์๋ก์ด ๋ฒ์ฉ ์ธ์ด ๊ธฐ๋ฅ์ ๋์
ํ ๊ฒ์ ์ ์ํ๋ ๋์ ์ ์์๋ฅผ ์ ์ถํ์ต๋๋ค(๋ฌธ์ #32473 ์ฐธ์กฐ). @josharian ์ ์๋
GopherCon์์ try
๊ฐ ์ค๋ฅ ๋ฐ์ ์ ๋ฐํ๋์ง ์๊ณ ๋์ error
๋ผ๋ ๋ ์ด๋ธ๋ก ์ ํ( goto
์ฌ์ฉ)ํ๋ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ธ์ต๋๋ค. , try
๋ ๋์ ๋ ์ด๋ธ์ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
5) try
๋ฅผ ํค์๋๋ก ํ์ฌ ๋ ์ค์ ์๊ฐ์ด ๋ ์ฌ๋๋ค. @brynbellomy ๋ ๋์์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ง์ ํ ์ ์๋ ๋ฒ์ ์ ์ ์ํ์ต๋๋ค.
a, b := try f()
a, b := try f() else err { /* handle error */ }
@thepudds ๋ ํ ๊ฑธ์ ๋ ๋์๊ฐ ์ค ์์ ๋ถ๋ถ์ try
๋ฅผ ์ ์ํ์ฌ try
์ return
์ ๋์ผํ ๊ฐ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
try a, b := f()
์ด ๋ ๊ฐ์ง ๋ชจ๋ defer
์๋ํ ์ ์์ต๋๋ค.
@griesemer
@mikeschinkel #32473์ ๋ํ ์ฐธ์กฐ ๋๋ถ์ ๊ณตํต์ ์ด ๋ง์ต๋๋ค.
~์ ๊ดํ์ฌ
๊ทธ๋ฌ๋ ๊ทํ์ ์ ์์ ์ฌ์ ํ ์๋๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ์ ์์ ์์ฝ๋ "build in/keyword/expression"์ด ์๋ "any" ํธ๋ค๋ฌ๋ก ๊ตฌํํ ์ ์์ง๋ง "try()"๊ฐ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(๋ฐ๋ผ์ ๋ฐ๋ ํฌํ๋ฅผ ํ์ง ์์์ต๋๋ค). "ํ๋"ํ๊ธฐ ์ํด - ๋ ๋ง์ ์ฅ์ ์ ๋ณด์ฌ์ค ๊ฒ์ด๋ฏ๋ก ๋ง์ ์ฌ๋๋ค์ด "์ผ๋จ go 2.0์ด ๋์ ๋ ๊ฒ"์ด๋ผ๊ณ ์์ํ์ต๋๋ค.
๋ง์ง๋ง ์์ฝ์์ ๋ณด๊ณ ํ "ํผํฉ๋ ๋ถ์๊ธฐ"์ ์์ธ์ผ ์๋ ์์ต๋๋ค. "try()๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ง ์์ต๋๋ค." - ๋ฌผ๋ก "Go 3.0์ด ๋ค๋ฅธ ์ฃผ์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ค์ ๋๋ค. "๊ณ ํต ์ฒ๋ฆฌ" ์์์ ์ธ๊ธํ ์ฌ๋๋ค์ด ๋๋ฌด ๊ธธ์ด ๋ณด์ ๋๋ค. :)
๋๋ "์ค๋ฅ ์ฒ๋ฆฌ์ ๊ณ ํต"์ ๋ํ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ์ํํ๊ณ ์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๊ณ ํต ์ค ์ผ๋ถ๋ ๋จ์ง "๋๋ ์ข์ ๊ดํ์ ์ฌ์ฉํ์ง ์์ต๋๋ค"๋ผ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ฉด์ ์ผ๋ถ๋ ์ฌ๋๋ค(๋๋ถ๋ถ ๋ค๋ฅธ ์ธ์ด์์ ์จ)์ด ํ๊ณ ์ถ์ดํ๋ ๊ฒ์ ์์์กฐ์ฐจ ํ์ง ๋ชปํ์ต๋๋ค. WTF๋ก).
์กฐ๋ง๊ฐ ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ง์ง๋ง์ผ๋ก - ๋๋ผ์ด ์์ ๊ณผ ์ธ๋ด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํ์ฌ ์ ์๋ ๊ตฌ๋ฌธ์ ๊ธธ์ด์ ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ์ ๋น๊ตํ๋ฉด ์ฒ๋ฆฌํ์ง ์๊ณ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ฅ์ํ๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ํธ๋ฆฌํฉ๋๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ตฌ๋ฌธ์ ์:
try a, b := f() else err { return fmt.Errorf("Decorated: %s", err); }
if a,b, err :=f; err != nil { return fmt.Errorf("Decorated: %s", err); }
try a, b := f()
if a,b, err :=f; err != nil { return err; }
๋ฐ๋ผ์ ์ด์ ์ ์๊ฐํ๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ ์ต์ํ ๋ฐ์ฝ๋ ์ดํ /์ฒ๋ฆฌ๋ ์ค๋ฅ์ ๊ฒฝ์ฐ์๋ go fmt๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ์ค๋ฅ ์ฌ๋ก๋ฅผ ๊ทธ๋ฅ ์ ๋ฌํ๋ ๋์ try์ ๊ฐ์ ๊ฒ์ด ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ผ๋ก ์ฌ์ ํ ๋ฐ๋์งํ ์ ์์ต๋๋ค.
try else
์ ๊ด๋ จํ์ฌ $# fmt.HandleErrorf
(ํธ์ง: ์
๋ ฅ์ด nil์ผ ๋ nil์ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํจ)์ ๊ฐ์ ์กฐ๊ฑด๋ถ ์ค๋ฅ ๊ธฐ๋ฅ์ ์ด๊ธฐ ์ฃผ์์์ ์ ์๋ํ๋ฏ๋ก else
๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ถํ์ํฉ๋๋ค.
a, b, err := doSomething()
try fmt.HandleErrorf(&err, "Decorated "...)
์ฌ๊ธฐ ์๋ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ try
๋ฅผ ํํ์๋ณด๋ค ๋ช
๋ น๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋๋ถ๋ถ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๋ ํํ์์ด Go์์ ์์ ํ ์ด์ง์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ ์ด๊ฒ์ ํํ์์ด ์๋๋ฏ๋ก ์ค์ ์์ ๋ถ๋ถ์ ์์ด์ผ ํฉ๋๋ค.
๋๋ ๋ํ ์ด๋ฆ์ด ์ ์ ํ์ง ์๋ค๋ @daved ์ ๋์ํฉ๋๋ค. ๊ฒฐ๊ตญ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ฌ์ฑํ๋ ค๋ ๊ฒ์ ๋ณดํธ๋ ํ ๋น์ด๋ฏ๋ก Swift์์์ ๊ฐ์ด guard
๋ฅผ ์ฌ์ฉํ๊ณ else
์ ์ ์ ํ ์ฌํญ์ผ๋ก ๋ง๋ค์ง ์๊ฒ ์ต๋๊น? ๊ฐ์ ๊ฒ
GuardStmt = "guard" ( Assignment | ShortVarDecl | Expression ) [ "else" Identifier Block ] .
์ฌ๊ธฐ์ Identifier
๋ ๋ค์ Block
์ ๋ฐ์ธ๋ฉ๋ ์ค๋ฅ ๋ณ์ ์ด๋ฆ์
๋๋ค. else
์ ์ด ์์ผ๋ฉด ํ์ฌ ํจ์์์ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(ํ์ํ ๊ฒฝ์ฐ ์ง์ฐ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฅ์ํฉ๋๋ค).
์ฒ์์๋ else
์ ์ด ๋ง์์ ๋ค์ง ์์์ต๋๋ค. ๊ทธ ์ด์ ๋ $# guard
if err != nil
๋ค์ ์ค๋ ์ผ๋ฐ์ ์ธ ํ ๋น์ ๋ํ ๊ตฌ๋ฌธ์์ ์คํ์ผ ๋ฟ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. guard
๋ ์๋๋ฅผ ๋ ๋ช
ํํ๊ฒ ํฉ๋๋ค.
ํธ์ง: ์ผ๋ถ๋ catch
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ง์ ํ๋๋ก ์ ์ํ์ต๋๋ค. else
์๋ฏธ๋ก ์ ์ผ๋ก ๋๊ฐ์ด ์คํ ๊ฐ๋ฅํ๊ณ ์ด๋ฏธ ์ธ์ด์ ์์ต๋๋ค.
๋๋ try-else ๋ฌธ์ ์ข์ํ์ง๋ง ์ด ๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น?
a, b, (err) := func() else { return err }
try
- else
ํํ์์ ์ผํญ ์ฐ์ฐ์์
๋๋ค.
a, b := try f() else err { ... }
fmt.Println(try g() else err { ... })`
๋ช
๋ น๋ฌธ try
- else
๋ if
๋ช
๋ น๋ฌธ์
๋๋ค.
try a, b := f() else err { ... }
// (modulo scope of err) same as
a, b, err := f()
if err != nil { ... }
์ ํ์ ํธ๋ค๋ฌ๊ฐ ์๋ ๋ด์ฅ try
๋ ๋์ฐ๋ฏธ ํจ์(์๋)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ try
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฌ์ฑํ ์ ์์ต๋๋ค(๊ทธ๋ฆผ์๋ ์์, ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์๊ณ ์์ต๋๋ค).
a, b := try(f(), decorate)
// same as
a, b := try(g())
// where g is
func g() (whatever, error) {
x, err := f()
if err != nil {
try(decorate(err))
}
return x, nil
}
์ธ ๊ฐ์ง ๋ชจ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ณ ์ค๋ฅ ๋ฒ์๋ฅผ ํฌํจํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ด์ฅ try
์ ๋ํด ๊ฐ์ฅ ๋ง์ ๋น์ฉ์ ์ ๊ฐํ ์ ์์ง๋ง ์ค๊ณ ๋ฌธ์์ ์ธ๊ธ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
try
- else
์ ๊ฒฝ์ฐ try
if
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ด์ ์ด ์์ต๋๋ค. ํ์ง๋ง ์ฅ์ ์ด ๋๋ฌด ๋ฏธ๋ฏธํด์ ๋ด๊ฐ ์ข์ํ๊ธด ํ์ง๋ง ๊ทธ ์์ฒด๋ก ์ ๋นํ๋๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์ธ ๊ฐ์ง ๋ชจ๋ ๊ฐ๋ณ ์ค๋ฅ์ ๋ํด ํน๋ณํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ชจ๋ ์ค๋ฅ๋ฅผ ๋๋ฑํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ defer
์์ ์ํํ ์ ์์ต๋๋ค. ๊ฐ else
๋ธ๋ก์์ ๋์ผํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ํ๋๋ ๊ฒฝ์ฐ ์ฝ๊ฐ ๋ฐ๋ณต๋ฉ๋๋ค.
func printSum(a, b string) error {
try x := strconv.Atoi(a) else err {
return fmt.Errorf("printSum: %w", err)
}
try y := strconv.Atoi(b) else err {
return fmt.Errorf("printSum: %w", err)
}
fmt.Println("result:", x + y)
return nil
}
ํน์ ์ค๋ฅ๊ฐ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ ํ์คํ ์๊ณ ์์ต๋๋ค. ๊ธฐ์ต์ ๋จ๋ ์ฌ๋ก๋ค์
๋๋ค. ํ์ง๋ง ๊ทธ๋ฐ ์ผ์ด 100๋ฒ ์ค 1๋ฒ๋ง ์ผ์ด๋๋ค๋ฉด try
๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๊ณ ๊ทธ๋ฌํ ์ํฉ์์ try
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ์ข์ง ์์๊น์? ๋ฐ๋ฉด์ 10๋ฒ ์ค 1๋ฒ ์ด์์ด๋ผ๋ฉด else
/handler๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์
๋๋ค.
else
/handler๊ฐ ์๋ try
๋ else๊ฐ ์๋ else
try
์ ์ค์ ๋ถํฌ๊ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๋ ์ค์ ๋ถํฌ๋ฅผ ๋ณด๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์์งํ๊ธฐ ์ฌ์ด ๋ฐ์ดํฐ๊ฐ ์๋๋๋ค.
@jimmyfrasche ์ ์ต๊ทผ ๋๊ธ์ ํ์ฅํ๊ณ ์ถ์ต๋๋ค.
์ด ์ ์์ ๋ชฉํ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค.
a, b, err := f()
if err != nil {
return nil, err
}
์ด ์ฝ๋๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ์์ฉ๊ตฌ๋ฅผ ์๋นํ ์ค์ผ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ธ์ด๋ฅผ ํ์ฅํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ๊ฐ์ ๊ฒ์ ๋ณผ ๋
try a, b := f() else err { return nil, err }
๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ๋ง์ด ์ ์ฝํ๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๋๋ผ์ง ์์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ธ ์ค์ ์ ์ฝํ๊ณ ์๋๋ฐ ์ด๋ ์ข์ ์ผ์ด์ง๋ง ์ ๊ณ์ฐ์ผ๋ก๋ 56์์์ 46์๋ก ์ค์์ต๋๋ค. ๋ณ๋ก์ ๋๋ค. ๋น๊ต
a, b := try(f())
์ด๋ 56์์์ 18์๋ก ์ค์ด๋ค์ด ํจ์ฌ ๋ ๋ง์ด ์ค์ด๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ try
๋ฌธ์ด ์ ์ด ํ๋ฆ์ ์ ์ฌ์ ์ธ ๋ณํ๋ฅผ ๋ณด๋ค ๋ช
ํํ๊ฒ ๋ง๋๋ ๋ฐ๋ฉด, ์ ๋ฐ์ ์ผ๋ก ๋ฌธ์ด ๋ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ๋ฌ์ค ์ธก๋ฉด์์ try
๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ์ฃผ์์ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
์ด์จ๋ ๋ด ์์ ์ ์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ๊ฒฝ์ฐ ์์ฉ๊ตฌ๋ฅผ ํฌ๊ฒ ์ค์ด๊ฑฐ๋ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฌ์์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์๋ ๊ฝค ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ ์์์ ์๋ํด์ผ ํฉ๋๋ค. ์์ฉ๊ตฌ์์ ์ฝ๊ฐ์ ๊ฐ์๋ง ์ป๋๋ค๋ฉด ์ ์๊ฐ์๋ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ ๋ํด @crawshaw ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด๋ฌํ ์๋ฅผ ์ฝ์ ๋ try
๊ธฐ๋ฅ์ผ๋ก ์ธํด ์ ์ด ํ๋ฆ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋ ์ฌ๊ณ ๋ฐฉ์์ ์ฑํํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ๋๋ ๊ทธ ํต์ ์ ํ๋ฆ์ด ๊ทธ ์ธ์ด๋ฅผ ์๋ ์ฌ๋๋ค์๊ฒ ๊ณง ์ 2์ ์ฒ์ฑ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์๋ง๋ ์๋ชป๋์์ต๋๋ค. ์ ์์ ์ธ ๊ฒฝ์ฐ์๋ ์ฌ๋๋ค์ด ์ค๋ฅ์ ๊ฒฝ์ฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง์ ๋ํด ๊ฑฑ์ ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. if err != nil { return err }
์์ ์ด๋ฏธ ์ ์ฝ์ ๋ฐ๋ฅด๋ฏ์ด try
์์ ์ ์ฝ์ ๋ฐ๋ฅด๋ฉด์ ์ด๋ฌํ ์๋ฅผ ์ฝ์ด๋ณด์ญ์์ค.
์ฌ๊ธฐ ์๋ ๋ชจ๋ ๋ด์ฉ์ ์ฝ๊ณ ์ถ๊ฐ๋ก ์๊ณ ํ ๊ฒฐ๊ณผ, try ๋ฅผ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์๋ ๋ฌธ์ฅ์ผ๋ก ๋ณผ ์ ์์์ง ํ์ ์ด ์์ง ์์ต๋๋ค.
๊ทธ ๊ทผ๊ฑฐ๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. IMHO๋ ์ฝ๋๋ฅผ "์ ๋ฆฌ"ํ์ง๋ง ์ค์ ๋ก ๋ณต์ก์ฑ์ ์ ๊ฑฐํ์ง๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๊ทธ๊ฒ์ ํ๋ฆฌ๊ฒ ํ ๋ฟ์
๋๋ค. ์ด๊ฒ์ ์ด์ ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. "๊ฐ
๊ทธ ์ด๋ฆ์ ๊ทธ ๊ธฐ๋ฅ์ ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ก, ๊ทธ๊ฒ์ด ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: "๋ง์ฝ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค๋ฉด, ํธ์ถ์๋ก๋ถํฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค." ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋๋ฌด ๊น๋๋ค :-) ์ต์ํ ๋ค๋ฅธ ์ด๋ฆ์ด ํ์ํฉ๋๋ค.
try์ ์์์ ์ค๋ฅ ๋ฐํ์ ์ฌ์ฉํ๋ฉด Go๊ฐ ๋ง์ง ๋ชปํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ฆ, A๊ฐ try ๊ฐ๋์์ ํธ์ถ๋๊ณ B๊ฐ try ๊ฐ๋์์ C๋ฅผ ํธ์ถํ๊ณ C๊ฐ try ๊ฐ๋์์ D๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ D๊ฐ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ๋ก์ปฌ์ด ์๋ goto๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ๋๋ฌด "๋ง๋ฒ์ "์ผ๋ก ๋๊ปด์ง๋๋ค.
๊ทธ๋ฌ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ง๊ธ ์๋๋ฅผ ์ ํํ๋ฉด ํด๋น ์ต์ ์ด ๋ซํ๋๋ค.
@ianlancetaylor
"๋ค๋ฅธ ์๋" ์ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด else
๋ธ๋ก์ ์ ํ ์ฌํญ์ด๋ฉฐ ์ฌ์ฉ์ ์ ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ฝ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๊ทํ์ ์์์ try a, b := f() else err { return nil, err }
else
์ ์ ์ค์ ๋ก ์ค๋ณต๋๋ฉฐ ์ ์ฒด ํํ์์ try a, b := f()
๋ก ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
@ianlancetaylor๋ ๋ง์ ์ ๋์ํฉ๋๋ค.
๊ฐ๋
์ฑ๊ณผ ์์ฉ๊ตฌ๋ ๋ ๊ฐ์ง ์ฃผ์ ๊ด์ฌ์ฌ์ด๋ฉฐ ์๋ง๋
go 2.0 ์ค๋ฅ ์ฒ๋ฆฌ(๋ค๋ฅธ ์ค์ํ ๋ฌธ์ ๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง)
๋ํ ํ์ฌ์
a, b, err := f()
if err != nil {
return nil, err
}
๊ฐ๋
์ฑ์ด ๋์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋ฏฟ๊ธฐ ๋๋ฌธ์
if a, b, err := f(); err != nil {
return nil, err
}
๊ฑฐ์ ์ฝ์ ์ ์์ง๋ง ๋ฒ์๊ฐ "๋ฌธ์ "์์ ์ ์์ต๋๋ค.
ifErr a, b, err := f() {
return nil, err
}
๊ทธ๊ฒ์ ๋จ์ง ; err != ๋ถ๋ถ์ด ์๊ณ ๋ฒ์๋ฅผ ์์ฑํ์ง ์๊ฑฐ๋
๋น์ทํ๊ฒ
์๋ a, b, ์ค๋ฅ := f() {
๋ฐํ ์์, ์ค๋ฅ
}
์ฌ๋ถ์ ๋ ์ค์ ์ ์งํ์ง๋ง ์ฌ์ ํ ์ฝ์ ์ ์์ต๋๋ค.
2019๋
6์ 11์ผ ํ์์ผ, 20:19 Dmitriy Matrenichev, [email protected]
์ผ๋ค:
@ianlancetaylor https://github.com/ianlancetaylor
"๋ค๋ฅธ ์๋" ์ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด else๊ฐ ์ฐจ๋จ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ํ ์ฌํญ์ด๋ฉฐ ์ฌ์ฉ์ ์ ๊ณต ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ฝ๋์ด ์์ต๋๋ค. ๊ทํ์ ์์์
try a, b := f() else err { return nil, err } else ์ ์ ์ค์ ๋ก
์ค๋ณต๋๋ฉฐ ์ ์ฒด ํํ์์ ๋จ์ํ try, b :=๋ก ์์ฑํ ์ ์์ต๋๋ค.
์ํ()โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4XPURMASWKZKOBPBVDPZ7NALA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LDNMVXH
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABNEY4SAFK4M5NLABF3NZO3PZ7NALANCNFSM4HTGCZ7Q
.
@ianlancetaylor
์ด์จ๋ ๋ด ์์ ์ ์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ๊ฒฝ์ฐ ์์ฉ๊ตฌ๋ฅผ ํฌ๊ฒ ์ค์ด๊ฑฐ๋ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฌ์์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์๋ ๊ฝค ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ ์์์ ์๋ํด์ผ ํฉ๋๋ค. ์์ฉ๊ตฌ์์ ์ฝ๊ฐ์ ๊ฐ์๋ง ์ป๋๋ค๋ฉด ์ ์๊ฐ์๋ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋์ํฉ๋๋ค. else
๋ ๊ตฌ๋ฌธ์์ ์คํ(์ด์ํ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค!)์ผ ๋ฟ์ด๋ฉฐ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก ๊ทธ๋ค์ง ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๊ทธ๋๋ try
๋ฅผ ์ง์ ๋ก ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
@ianlancetaylor Echoing @DmitriyMV , else
๋ธ๋ก์ ์ ํ ์ฌํญ์
๋๋ค. ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋ ์๋ฅผ ๋ค๊ฒ ์ต๋๋ค(์ค์ ์ฝ๋์์ ์ฒ๋ฆฌ๋ ๋ธ๋ก๊ณผ ์ฒ๋ฆฌ๋์ง ์์ try
๋ธ๋ก์ ์๋์ ๋น์จ ์ธก๋ฉด์์ ๋ณผ ๋ ๋๋ฌด ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค).
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
headRef, err := r.Head()
if err != nil {
return err
}
parentObjOne, err := headRef.Peel(git.ObjectCommit)
if err != nil {
return err
}
parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit)
if err != nil {
return err
}
parentCommitOne, err := parentObjOne.AsCommit()
if err != nil {
return err
}
parentCommitTwo, err := parentObjTwo.AsCommit()
if err != nil {
return err
}
treeOid, err := index.WriteTree()
if err != nil {
return err
}
tree, err := r.LookupTree(treeOid)
if err != nil {
return err
}
remoteBranchName, err := remoteBranch.Name()
if err != nil {
return err
}
userName, userEmail, err := r.UserIdentityFromConfig()
if err != nil {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
_, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
if err != nil {
return err
}
return nil
}
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
try remoteBranchName := remoteBranch.Name()
try userName, userEmail := r.UserIdentityFromConfig() else err {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
try r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
return nil
}
try
/ else
ํจํด์ ๋ณตํฉ if
๋ฅผ ํตํด ๋ง์ ๋ฌธ์๋ฅผ ์ ์ฅํ์ง ์์ง๋ง ๋ค์์ ์ํํฉ๋๋ค.
try
๋ก ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ํตํฉํฉ๋๋ค.if
ํํฉ๋ฌผ์ด ๊ฒช๋ ์ด์ํ ๋ฒ์ ์ง์ ์ ์ค์ผ ์ ์๋ ๊ธฐํ๋ฅผ ์ฃผ์ธ์.์ฒ๋ฆฌ๋์ง ์์ try
๊ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ ๊ฒ์
๋๋ค.
@ianlancetaylor
if err != nil { return err } ์ด๋ฏธ ์ ์ฝ์ ๋ฐ๋ฅด๋ฏ์ด ์ ์ฝ์ ๋ฐ๋ฅด๋ ๋์ ์ด ์์ ๋ฅผ ์ฝ์ด๋ณด์ญ์์ค.
๋๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ณต์กํ ์ค์ try๊ฐ ์๋์ง, ์ ํํ ๋ฌด์์ ๊ฐ์ธ๋์ง, ๋๋ ํ ์ค์ ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ์๋ค๋ ๊ฒ์ ๋์น๋ฉด... ์ด๊ฒ๋ค์ ๋ฆฌํด ํฌ์ธํธ๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ์ํ๊ณ ๊ทธ ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค.
@ianlancetaylor
๋๋ ์ ์ง ์ ํธ๋ฅผ ๋ณผ ๋ ์ธ์๋ ๋จ์ด๋ฅผ ์ฝ๊ณ ๊ทธ ๊น์ ์๋ฏธ๋ฅผ ์๊ณ ํ๋ ๊ฒ๋ณด๋ค ๋ชจ์๊ณผ ์์์ผ๋ก ๋ ๋ง์ด ์ธ์ํฉ๋๋ค.
๋ด ๋์ if err != nil { return err }
์ด์์ผ๋ก ๋น๋ ์ ์์ง๋ง ๋์์ ์ฌ์ ํ ๋ช
ํํ๊ณ ์ฆ๊ฐ์ ์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค.
try
-statement ๋ณํ์ ๋ํด ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ ๊ทธ๊ฒ์ด ์์ฉ๊ตฌ๋ฅผ ์ค์ฌ์ฃผ์ง๋ง ์ ์ฝ์ ๋ฐ๋ฅด๊ธฐ๋ ์ฝ์ง๋ง ๋์น๊ธฐ ์ด๋ ค์ด ๋ฐฉ์์ด๋ผ๋ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ ์ ๊ธฐ์ ์ถ๊ฐ ์ค์ ์๋ฏธํ ์ ์์ง๋ง ์ด๋ ํ์ฌ ์ํ๋ณด๋ค ์ฌ์ ํ ์ ์ ์์ ๋๋ค.
@brynbellomy
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
if headRef, err := r.Head(); err != nil {
return err
} else if parentObjOne, err := headRef.Peel(git.ObjectCommit); err != nil {
return err
} else parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit); err != nil {
return err
} ...
๊ฐ๋ ์ฑ ์ธก๋ฉด์์๋ ๊ทธ๋ค์ง ๋ค๋ฅด์ง ์์ง๋ง(๋๋ fmt.Errorf("error with head : %s", err.Error()) ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์์ ํ๊ณ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฌ์ ํ ์์๋ฆฌ๋
๋๊ตฐ๊ฐ๊ฐ ์ด๋ฏธ ์ด์ ๊ฐ์ ๊ฒ์ ๊ฒ์ํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค(๋ง์ ์ข์ ์์ด๋์ด๊ฐ ์์ต๋๋ค :P ) ์ด ๋์ฒด ๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น?
fail := func(err error) error {
log.Print("unexpected error", err)
return err
}
a, b, err := f1() // normal
c, d := f2() -> throw // calls throw(err)
e, f := f3() -> panic // calls panic(err)
g, h := f4() -> t.Error // calls t.Error(err)
i, j := f5() -> fail // calls fail(err)
์ฆ, ๋ฐํ๋ err != nil์ธ ๊ฒฝ์ฐ ํธ์ถ๋๋ ํจ์ ํธ์ถ ์ค๋ฅธ์ชฝ์ -> handler
๊ฐ ์์ต๋๋ค. ํธ๋ค๋ฌ๋ ์ค๋ฅ๋ฅผ ๋จ์ผ ์ธ์๋ก ๋ฐ์๋ค์ด๊ณ ์ ํ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค(์: func(error)
๋๋ func(error) error
). ํธ๋ค๋ฌ๊ฐ nil ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ํจ์๊ฐ ๊ณ์ ์งํ๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐํ๋ฉ๋๋ค.
๋ฐ๋ผ์ a := b() -> handler
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
a, err := b()
if err != nil {
if herr := handler(err); herr != nil {
return herr
}
}
์ด์ ๋ฐ๋ก ๊ฐ๊ธฐ๋ก a := b() -> throw
์ ์ฝ์ด์ธ try
๋ด์ฅ(๋๋ ํค์๋ ๋๋ ?=
์ฐ์ฐ์ ๋ฑ)์ ์ง์ํ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
func() error {
a, b := try(f1())
c, d := try(f2())
e, f := try(f3())
...
return nil
}() -> panic // or throw/fail/whatever
๊ฐ์ธ์ ์ผ๋ก ?=
์ฐ์ฐ์๋ try ํค์๋/๋ด์ฅ๋ณด๋ค ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
func() error {
a, b ?= f1()
c, d ?= f2()
e, f ?= f3()
...
return nil
}() -> panic
์ฐธ๊ณ : ์ฌ๊ธฐ์์๋ ํธ์ถ์์๊ฒ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ด์ฅ์ ๋ํ ์๋ฆฌ ํ์์๋ก throw๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฐฌ์ฑํ๊ณ ๊ทธ๋ค์ด ํฅํ๊ณ ์๋ ๋ฐฉ์์ ์ข์ํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ๊น์ง ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ ๋ํด ์ธ๊ธํ์ง ์์์ต๋๋ค. ์ ์์ ์ ์๋ try ํจ์์ @thepudds ๊ฐ ์ ์ํ try ๋ฌธ์ ๋ชจ๋ ์ธ์ด์ ํฉ๋นํ ์ถ๊ฐ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ฐ๋ํ์ด ๋ฌด์์ ํ๋ ์ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ค.
์ ์์์์ try๊ฐ ์ ์๋ ๋ฐฉ์๊ณผ ์ด๊ฒ์ด ํฅํ ํ์ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง์ ๋ํ ์ฌ์ํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ๊ธฐํ๊ณ ์ถ์ต๋๋ค.
Try๋ ๋ค์ํ ์ธ์๋ฅผ ์ทจํ๋ ํจ์๋ก ์ ์๋ฉ๋๋ค.
func try(t1 T1, t2 T2, โฆ tn Tn, te error) (T1, T2, โฆ Tn)
try(f())
์์์ ๊ฐ์ด ํจ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ try
์ ์ ๋ฌํ๋ ๊ฒ์ Go์์ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ด ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ธํด ์์์ ์ผ๋ก ์๋ํฉ๋๋ค.
์ ์์๋ฅผ ์ฝ์ด๋ณธ ๊ฒฐ๊ณผ ๋ค์ ์ค๋ํซ์ ๋ชจ๋ ์ ํจํ๊ณ ์๋ฏธ์ ์ผ๋ก ๋์ผํฉ๋๋ค.
a, b = try(f())
//
u, v, err := f()
a, b = try(u, v, err)
์ ์์ ๋ํ ์ถ๊ฐ ์ธ์๋ก try
๋ฅผ ํ์ฅํ ๊ฐ๋ฅ์ฑ์ ๋์
๋๋ค.
๋ช ์์ ์ผ๋ก ์ ๊ณต๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ํจ์์ ํ์์ด๋ ํด๋น ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ํ๋จ๋๋ฉด ํด๋น ์ถ๊ฐ ์ธ์๋ฅผ try ํธ์ถ์ ์ ๋ฌํ๋ ๊ฒ์ด ๊ฑฐ์ ๊ฐ๋ฅํฉ๋๋ค.
ํธ๋ค๋ฌ ์ธ์๋ฅผ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ธ์ ๋ชฉ๋ก์ ์์ ๋๋ ๋์ ์ฌ ์ ์์ต๋๋ค.
var h handler
a, b = try(h, f())
// or
a, b = try(f(), h)
(์์ ์๋ฏธ๋ฅผ ๊ฐ์ํ ๋) try
๋ ๋ช
์์ ํธ๋ค๋ฌ ์ธ์์ ํธ๋ค๋ฌ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๊ตฌ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ๋ถ๋ถ์ ๋๋ ๊ฒ์ ์๋ํ์ง ์์ต๋๋ค.
func f() (handler, error) { ... }
func g() (error) { ... }
try(f())
try(h, g())
๋์ ๋์ผ๋ฉด ์๋ง๋ ์๋ํ์ง๋ง try๋ ์ธ์ ๋ชฉ๋ก์ ์์ ๋ถ๋ถ ์ varargs ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ์ผํ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ธ์ด์์ ๊ณ ์ ํ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ค ์ด๋ ๊ฒ๋ ๋์ ๋๋ ๊ฒ์ ์๋์ง๋ง try
๊ฐ ๋๋จธ์ง ์ธ์ด์ ์ผ์นํ์ง ์๋ ๋๋์ ์ฃผ๋ฏ๋ก try
์ด ์ ์ ์ํ.
@๋ง๋ฒ ๊ฐ์
ํธ๋ค๋ฌ๋ฅผ ๊ฐ๋ ๊ฒ์ ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ ฅํฉ๋๋ค.
๋๋ ๋น์ ์ด ์ด๋ฏธ h๋ฅผ ์ ์ธํ์ต๋๋ค.
๋น์ ์ ํ ์ ์์ต๋๋ค
var h handler
a, b, h = f()
๋๋
a, b, h.err = f()
ํจ์์ ๊ฐ์ ๊ฒฝ์ฐ:
h:= handler(err error){
log(...)
return ....
}
๊ทธ๋ฌ์ ์ ์์ด ์์๋ค.
a, b, h(err) = f()
๋ชจ๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๋ํ ์ผ๋ถ ์ ์๋ ๋๋ก ์ค๋ฅ(๊ณ์/์ค๋จ/๋ฐํ)๋ฅผ ๋ฐํํ๊ฑฐ๋ ์บก์ฒ๋ง ํ๋ ์ฒ๋ฆฌ๊ธฐ๋ฅผ "์ ํ"ํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ varargs ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ก์ต๋๋ค.
@brynbellomy์ else
์ ์์ ๋ํ ๋์:
a, b := try f() else err { /* handle error */ }
else ์งํ์ ์ฅ์ ๊ธฐ๋ฅ์ ์ง์ํ ์ ์์ต๋๋ค.
decorate := func(err error) error { return fmt.Errorf("foo failed: %v", err) }
try a, b := f() else decorate
try c, d := g() else decorate
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ถ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค.
decorate := fmt.DecorateErrorf("foo failed")
๋ฐ์ฝ๋ ์ด์
ํจ์๋ func(error) error
์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์๋ ์ค์ธ ๊ด๋ จ ํจ์์์ try๊ฐ ๋ฐํ๋๊ธฐ ์ง์ ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ try์ ์ํด ํธ์ถ๋ฉ๋๋ค.
์ด๋ ์ ์ ๋ฌธ์์ ์ด์ "์ค๊ณ ๋ฐ๋ณต" ์ค ํ๋์ ์ ์ ์ด ๋น์ทํ ๊ฒ์ ๋๋ค.
f := try(os.Open(filename), handler) // handler will be called in error case
๋๊ตฐ๊ฐ ๋ ๋ณต์กํ ๊ฒ์ ์ํ๊ฑฐ๋ ๋ช
๋ น๋ฌธ ๋ธ๋ก์ ์ํ๋ฉด ๋์ if
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(์ค๋๋ ์ฒ๋ผ).
์ฆ, https://github.com/golang/go/issues/32437#issuecomment -500949780์ @brynbellomy์ ์์ ํ์๋ try
์ ์๊ฐ์ ์ ๋ ฌ์ ๋ํด ์ข์ ์ ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด ๊ท ์ผํ ์ค๋ฅ ์ฅ์์ ์ํด ์ ํ๋๋ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ์ฌ์ ํ defer
์ ํจ๊ป ์๋ํ ์ ์์ต๋๋ค(๋๋ ์ด๋ก ์์ผ๋ก ์ฅ์ ๊ธฐ๋ฅ์ ๋ฑ๋กํ๋ ๋์ฒด ํ์์ด ์์ ์ ์์ง๋ง ์ด๋ ๋ณ๋์ ์์ ์
๋๋ค).
์ด์จ๋ ์ฌ๊ธฐ์์ ๊ฐ์ฅ ์ข์ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ค๋ฅธ ์ต์ ์ ๋ช ์์ ์ผ๋ก ๋ง๋ค๊ณ ์ถ์์ต๋๋ค.
๋ค์์ @thepudds ๊ฐ https://github.com/golang/go/issues ์์ ์ง์ ํ ๋ฉ์ง ์ ๋ ฌ์ ์ ์งํ๊ธฐ ์ํด var
try
ํจ์๋ก ๋ค์ ์์ฑ๋ @brynbellomy ์ ์์
๋๋ค. /32437#issuecomment -500998690.
package main
import (
"fmt"
"time"
)
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
var (
headRef = try(r.Head())
parentObjOne = try(headRef.Peel(git.ObjectCommit))
parentObjTwo = try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne = try(parentObjOne.AsCommit())
parentCommitTwo = try(parentObjTwo.AsCommit())
treeOid = try(index.WriteTree())
tree = try(r.LookupTree(treeOid))
remoteBranchName = try(remoteBranch.Name())
)
userName, userEmail, err := r.UserIdentityFromConfig()
if err != nil {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
_, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
return err
}
try
-statement ๋ฒ์ ๋งํผ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ๋ ์ข์ต๋๋ค. try
๋ ํํ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋
์ฑ์ ํฌ์์ํค๋ฉด์ ์ด๋ฌํ ์ค๊ฐ ๋ณ์ ์ค ์ผ๋ถ๋ฅผ ์ ๊ฑฐํ ์ ์์ง๋ง ๊ทธ๊ฒ์ ๋ค๋ฅธ ๋ฌด์๋ณด๋ค ์คํ์ผ์ ๋ฌธ์ ์ฒ๋ผ ๋ณด์
๋๋ค.
๊ทธ๋ฌ๋ try
๊ฐ var
๋ธ๋ก์์ ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ง๋ฌธ์ ์ ๊ธฐํฉ๋๋ค. ๋๋ var
์ ๊ฐ ํ์ด ์ธ์ ํ ๋น๋๋ ์์์ ๋ฐ๋ผ ์ ์ฒด ๋ธ๋ก์ด ๋จ์ผ ๋ช
๋ น๋ฌธ์ด ์๋๋ผ ๋ณ๋์ ๋ช
๋ น๋ฌธ์ผ๋ก ๊ฐ์ฃผ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
"์๋" ์ ์์ด ์์งํ ๋ฌธ ๊ณ์ฐ์ ์ฌ์ฉํ์ฌ ๋๋ต์ ์ธ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ํต๊ณ๋ฅผ ๋ํ๋ด๋ cmd/cover์ ๊ฐ์ ๋๊ตฌ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ช ์์ ์ผ๋ก ์ธ๊ธํ๋ฉด โโ์ข์ ๊ฒ์ ๋๋ค. ๋ณด์ด์ง ์๋ ์ค๋ฅ ์ ์ด ํ๋ฆ์ผ๋ก ์ธํด ๊ณผ์ ๊ณ์ฐ๋์ง ์์๊น ๊ฑฑ์ ๋ฉ๋๋ค.
@thepudds
try, b := f() else ์ฅ์
์๋ง๋ ๋ด ๋ ์ธํฌ์ ํ์์ด ๋๋ฌด ์ฌํด์
try a, b := f() ;catch(decorate)
๊ทธ๋ฆฌ๊ณ ๋ฏธ๋๋ฌ์ด ๊ฒฝ์ฌ๋ก
a, b := f()
catch(decorate)
๊ทธ๊ฒ์ด ์ด๋๋ก ํฅํ๊ณ ์๋์ง ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฅผ ์ํด
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
try remoteBranchName := remoteBranch.Name()
~์ ํจ๊ป
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
remoteBranchName := remoteBranch.Name()
)
(๋๋ ์ฌ์ง์ด ๋ง์ง๋ง์ ์บ์น)
๋ ๋ฒ์งธ๋ ๋ ์ฝ๊ธฐ ์ฝ์ง๋ง ์๋ ํจ์๊ฐ 2๊ฐ์ var๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๊ณ ์ฐ๋ฆฌ๋ ํ๋๋ฅผ ๋ง์ ์ฒ๋ผ ๋ฒ๋ฆฌ๊ณ "magic Returns err"๋ก ์์งํฉ๋๋ค.
try(err) (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
remoteBranchName := remoteBranch.Name()
); err!=nil {
//handle the err
}
์ต์ํ ๋ช ์์ ์ผ๋ก ๋ฐํํ ๋ณ์๋ฅผ ์ค์ ํ๊ณ ๋ด๊ฐ ์ํ ๋๋ง๋ค ํจ์ ๋ด์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ๋ช
์์ ์ผ๋ก ์ธ๊ธํ์ง ์์๊ธฐ ๋๋ฌธ์ ํน์ ์ฃผ์์ ์ฝ์
ํ๋ ๊ฒ๋ฟ์
๋๋ค. ํนํ gofmt
๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ค์ ํ ์ค ์์ ๋๋ ๋ชจ๋ ๋ณํ์ ์ง์ํ๋ ๊ฒ์ ๋ํด ์ธ๊ธํ ๊ฒ์
๋๋ค.
if f() { return nil, err }
์ ๋ฐ, ์๋. if
ํ ์ค์ ์ํ๋ฉด ํ ์ค if
, ์:
if f() then return nil, err
๊ทธ๋ฌ๋ ์ ๋ฐ, ์ ๋ฐ, ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ์ค ๋ฐ๊ฟ์ ์ ๊ฑฐํ๋ ๊ตฌ๋ฌธ ์๋ฌ๋๋ฅผ ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค.
ํ ๋ก ์ ์ด๊ธฐ ์์์ ์ํ์ง ์ ์๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค.
1) ์ด ์ ์์ ์์ ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ๋ผ์ง๊ฒ ํ๋ ๊ฒ์
๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์ง๋ฐฐํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ช
์์ ์ด์ด์ผ ํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฑ ๋๋๋ฌ์ง๊ฒ ๋ง๋๋ ๋์ ์ ์์ ์์ ์ ๋์น๊ณ ์์ต๋๋ค. @ianlancetaylor ๊ฐ ์ด๋ฏธ ๋งํ๋ฏ์ด ์ด๋ฌํ ๋์ ์ ์์ด ์์ฉ๊ตฌ์ ์์ ํฌ๊ฒ ์ค์ด์ง ์์ผ๋ฉด if
๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. (๊ทธ๋ฆฌ๊ณ ์์ฉ๊ตฌ๋ฅผ ์ค์ฌ๋ฌ๋ผ๋ ์์ฒญ์ Go ์ปค๋ฎค๋ํฐ์์ ์จ ๊ฒ์
๋๋ค.)
2) ํ์ฌ ์ ์์ ๋ํ ๋ถ๋ง ์ค ํ๋๋ ์ก์ธ์ค๋ฅผ ์ป๊ธฐ ์ํด ์ค๋ฅ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋์์ด ์ถ๊ฐ ๊ตฌ๋ฌธ, ์ฆ ํด๋น ๋ณ์์ ์ด๋ฆ์ ๋ช
์์ ์ผ๋ก ์ง์ ํ๊ธฐ ์ํด ๋ ๋ง์ ์์ฉ๊ตฌ(์: ... else err { ... }
๋ฑ)๋ฅผ ๋์
ํ์ง ์๋ ํ ๋ชจ๋ ๋์ ์ ์์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ฐ์ต๋๋ค. ํ์ง๋ง ํฅ๋ฏธ๋ก์ด ์ ์: ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๋ ๋ฐ ๊ด์ฌ์ด ์๊ณ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ง์ ํ์ง ์์๋ ์ผ์ข
์ ๋ช
์์ ํธ๋ค๋ฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋ช
์์ return
๊ฐ ํ์ํ ๊ฒฝ์ฐ, ํด๋น return
๋ฌธ์ ์ด ๊ฒฝ์ฐ ๋ค์ดํค๋ ๋ฆฌํด์ด ํ์ฉ๋์ง ์์ผ๋ฏ๋ก ๋ชจ๋ (์ผ๋ฐ์ ์ผ๋ก 0) ๊ฒฐ๊ณผ ๊ฐ์ ์ด๊ฑฐํด์ผ ํฉ๋๋ค. ํนํ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ์ง ์๊ณ ๋ง์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ช
์์ ๋ฐํ( return nil, err
๋ฑ)์ด ์์ฉ๊ตฌ์ ์ถ๊ฐ๋ฉ๋๋ค. ํ์ฌ ์ ์๊ณผ ๋ช
์์ ์ธ return
๊ฐ ํ์ํ์ง ์์ ๋์์ ์ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ฐ๋ฉด์ ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๊ณ ์ถ๋ค๋ฉด ํ์ฌ ์ ์์ ์ค๋ฅ ๊ฐ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ค๋ฅ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ๋๋ก _์๊ตฌํฉ๋๋ค_. ์ด๊ฒ์ ๋ช
์์ ํธ๋ค๋ฌ์์ ๋ค์ดํค๋ ๋ฆฌํด์ ์ฌ์ฉํ ์ ์๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ๋ณตํ ํ์๊ฐ ์๋ค๋ ์ข์ ๋ถ์์ฉ์ด ์์ต๋๋ค. (๋ค์ดํค๋ ๋ฆฌํด์ ๋ํด ๊ฐํ ๋๋์ด ์๋ค๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฌ๋ ํ์ค์ ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ๋ชจ๋ ๊ฒ์ด ์ค๋ฅ ๊ฒฐ๊ณผ์ผ ๋ ๋ค๋ฅธ ๋ชจ๋ (์ผ๋ฐ์ ์ผ๋ก 0) ๊ฒฐ๊ณผ ๊ฐ์ ์ด๊ฑฐํด์ผ ํ๋ ๊ฒ์ ์ ๋ง ์ฑ๊ฐ์ ์ผ์
๋๋ค. ์ฝ๋์ ์ดํด). ์ฆ, ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ์ฅ์ํ ์ ์๋๋ก ์ด๋ฆ์ ์ง์ ํด์ผ ํ๋ฏ๋ก ์์ฉ๊ตฌ๋ฅผ ๋์ฑ ์ค์ผ ์ ์์ต๋๋ค.
@magical ์ง์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ ์์ ๊ฒ์ํ ์งํ ๋์ผํ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค(๊ทธ๋ฌ๋ ๋ ์ด์ ํผ๋์ ์ผ์ผํค์ง ์๊ธฐ ์ํด ์ธ๊ธํ์ง ์์์ต๋๋ค). try
๋ ํ์ฅํ ์ ์๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๋คํํ ์์ ์ ์ถฉ๋ถํ ์ฝ์ต๋๋ค. (์ฐ๋ฆฌ์ ์ด์ ๋ด๋ถ ์ ์์๋ ์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ถํ์ ์ํด ์ต์ข
๋ฒ์ ์ ๋ค์ ์์ฑํ๊ณ ๊ธฐ์กด ๋งค๊ฐ๋ณ์ ์ ๋ฌ ๊ท์น๊ณผ ๋ ๊ฐ๊น๊ฒ ์ผ์นํ๋๋ก try
๋ฅผ ๋จ์ํํ๋ ค๊ณ ์๋ํ ๋ ๋์
๋์์ต๋๋ค. ์ข์ ๊ฒ ๊ฐ์์ต๋๋ค. - ๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฒฐํจ์ด ์๊ณ ๋๋ถ๋ถ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. try(a, b, c, handle)
๋ฅผ ์ธ ์ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค.)
try
์ ์ด์ ๋ฒ์ ์ ๋๋ต ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ต๋๋ค: try(expr, handler)
๋ ํ๋(๋๋ ์๋ง๋ ๋ ๊ฐ) ํํ์์ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ํํ์์ ๋ค์ค ๊ฐ์ผ ์ ์์ต๋๋ค(ํํ์์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ ์ ์์ต๋๋ค. ํจ์ ํธ์ถ). ํด๋น(๋ค์ค๊ฐ) ํํ์์ ๋ง์ง๋ง ๊ฐ์ error
์ ํ์ด์ด์ผ ํ๋ฉฐ ํด๋น ๊ฐ์ nil์ ๋ํด ํ
์คํธ๋ฉ๋๋ค. (๋ฑ - ๋น์ ์ด ์์ํ ์์๋ ๋๋จธ์ง).
์ด์จ๋ ์์ ์ try
๊ตฌ๋ฌธ์ ํ๋ ๋๋ ๋ ๊ฐ์ ํํ์๋ง ํ์ฉํ๋ค๋ ๊ฒ์
๋๋ค. (๊ทธ๋ฌ๋ try
์ ์๋ฏธ๋ฅผ ์ค๋ช
ํ๋ ๊ฒ์ ์กฐ๊ธ ๋ ์ด๋ ต์ต๋๋ค.) ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ๋ฉ๋๋ค.
a, b := try(u, v, err)
๋ ์ด์ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒ์๋ถํฐ ์ด ์์
์ ์ํํ ์ด์ ๋ ๊ฑฐ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ( a
๋ฐ b
๊ฐ ๊ฒฐ๊ณผ๋ก ๋ช
๋ช
๋์ง ์์ ๊ฒฝ์ฐ) ์ด ์ฝ๋๋ - ์ด๋ค ์ด์ ๋ก๋ ์ค์ํ๋ค๋ฉด - ๋ค์์ผ๋ก ์ฝ๊ฒ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
a, b := u, v // we don't care if the assignment happens in case of an error
try(err)
(๋๋ ํ์์ ๋ฐ๋ผ if
๋ฌธ์ ์ฌ์ฉํ์ญ์์ค). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ค์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๊ฒฝ์ฐ์๋ ๋ค์ดํค๋ ๋ฆฌํด์ด ํ์ฉ๋์ง ์์ผ๋ฏ๋ก return ๋ฌธ์ ๋ชจ๋ (์ผ๋ฐ์ ์ผ๋ก 0) ๊ฒฐ๊ณผ ๊ฐ์ ์ด๊ฑฐํด์ผ ํฉ๋๋ค.
์๋ชธ ๋ฐํ์ ํ์ฉ๋์ง ์์ง๋ง ์๋๋ ํ์ฉ๋ฉ๋๋ค. ๋ด๊ฐ try(ํจ์ ๋๋ ๋ช ๋ น๋ฌธ์ผ๋ก)์ ๋ํด ์ข์ํ๋ ํ ๊ฐ์ง๋ ์ค๋ฅ๋ฅผ ๋ฐํํ ๋ ์ค๋ฅ๊ฐ ์๋ ๊ฐ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ ์ด์ ์๊ฐํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ๋ ๊ทธ๋ฅ try๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
@griesemer ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ์ ๋ ๋ด๋ฆฐ ๊ฒฐ๋ก ์ ๋๋ค.
try
์ ๋ํ ๊ฐ๋ตํ ์ค๋ช
: https://github.com/golang/go/issues/32437#issuecomment -501035322์ ์์์ ๋ณผ ์ ์๋ฏ์ด try
๋ ๋ฆฌ๋๋ฅผ ๋ฌป์ต๋๋ค. ์ฝ๋๋ ์ผ๋ จ์ try
๋ฌธ์ด ๋์ด ์ฝ๋๊ฐ ์ค์ ๋ก ์ํํ๋ ์์
์ ๊ฐ๋ฆฝ๋๋ค.
๊ธฐ์กด ์ฝ๋๋ if err != nil
๋ธ๋ก ๋ค์ ์ ์๋ก ์ ์ธ๋ ์ค๋ฅ ๋ณ์๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค. ๋ณ์๋ฅผ ์จ๊ธฐ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ๋ช
๋ช
๋ ๋ฐํ ๋ณ์๋ฅผ ํจ์ ์๋ช
์ ์ถ๊ฐํด๋ ํญ์ ์์ ๋๋ ๊ฒ์ ์๋๋๋ค.
์ค๋ฅ ์ ์ธ/ํ ๋น์ ๊ทธ๋๋ก ๋๊ณ ํ ์ค ์ค๋ฅ ์ฒ๋ฆฌ stmt๋ฅผ ์ฐพ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
err := f() // followed by one of
on err, return err // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err) // doesn't stop the function
on err, hname err // handler invocation without parens
on err, ignore err // optional ignore handler logs error if defined
if err, return err // alternatively, use if
handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
if err == io.Bad { return err }
fmt.Println(clr.name, err)
}
try
ํ์ ํํ์์ ํจ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฆ, ์ค๋ฅ๊ฐ ์์๋์ง ์์ต๋๋ค. ๊ทธ ๋ณํ์ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
f(try g()) // panic on error
f(try_ g()) // ignore any error
์ด ์ ์์ ์์ ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ๋ผ์ง๊ฒ ํ๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์ง๋ฐฐํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ช ์์ ์ด์ด์ผ ํฉ๋๋ค.
try
์ ์ค๋ช
์ผ๋ก ๋์ดํ๋ ๋๊ธ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ช
์์ ์ด์ง๋ง(๊ธธ์ด๊ฐ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์) ๋ฌด์ํ๊ธฐ ์ฝ์ง๋ง(ํญ์ ๊ฐ์ ์์น์ ์๊ธฐ ๋๋ฌธ์) ๋ถ๋น๋ ์ ์์ ์จ๊ฒจ์ง ์ ์์ผ๋ฏ๋ก ์ฝ๊ฒ ๋ฌด์ํ ์ ์์ต๋๋ค. ์ด์ ์ ์ธ๊ธํ ๋๋ก defer fmt.HandleErrorf(...)
์ ๊ฒฐํฉํ ์๋ ์์ง๋ง ์ค๋ฅ๋ฅผ ๋ํํ๊ธฐ ์ํด ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋จ์ฉํ๋ ํจ์ ์ด ์์ต๋๋ค.
๋ด๊ฐ try
๋ผ๋ ํํ์ ์ข์ํ์ง ์๋ ์ด์ ์ค ํ๋๋ ๋๋ฌด ์ฝ๊ฒ ์ง๋์น๊ฑฐ๋ ์ง๋์น ๋งํผ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ค์ ๋ ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด์ธ์.
// Too hidden, it's in a crowded function with many symbols that complicate the function.
f, err := os.OpenFile(try(FileName()), os.O_APPEND|os.O_WRONLY, 0600)
// Not easy enough, the word "try" already increases horizontal complexity, and it
// being an expression only encourages more horizontal complexity.
// If this code weren't collapsed to multiple lines, it would be extremely
// hard to read and unclear as to what's executing when.
fullContents := try(io.CopyN(
os.Stdout,
try(net.Dial("tcp", "localhost:"+try(buf.ReadString("\n"))),
try(strconv.Atoi(try(buf.ReadString("\n")))),
))
// easy to see while still not being too verbose
try name := FileName()
os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
// does not allow for clever one-liners, code remains much more readable.
// also, the code reads in sequence from top-to-bottom.
try port := r.ReadString("\n")
try lengthStr := r.ReadString("\n")
try length := strconv.Atoi(lengthStr)
try con := net.Dial("tcp", "localhost:"+port)
try io.CopyN(os.Stdout, con, length)
์ด ์ฝ๋๋ ํ์คํ ๊ณ ์๋ ๊ฒ์
๋๋ค. ์ธ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์ป๊ณ ์๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก try
ํํ์์ด ์ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ try
๋ก ๊ฐ ํ์ ์์ํ๋ ๊ฒ์ด ๊ฐ ๋ช
๋ น๋ฌธ์ ์ค์ํ ๋ถ๋ถ(์ ์๋๋ ๋ณ์ ๋๋ ์คํ๋๋ ํจ์)์ ๋ฐฉํดํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ @ianlancetaylor ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ํ์ง๋ง ๊ฐ์ ์์น์ ์๊ณ ๋๋น๊ฐ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋์ ๋๋ฉด์ ๊ดํ์ด ๋๋ ๊ฒ์ด ํจ์ฌ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ง๋ค ๋์ด ๋ค๋ฆ
๋๋ค.
๋ํ ์ฝ๋์์ ์๋ฆฌํ ๋จ์ผ ๋ผ์ด๋๋ฅผ ๊ถ์ฅํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์์์์ ๊ฐ์ด ๊ฐ๋ ฅํ ํ ์ค์ง๋ฆฌ ๋ผ์ด๋๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค. ๋๋ฌด ๋ง์ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ์์ฒด ์ ์ฒด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋ ์ค๋ํซ์ ๋๋ค. ํ์ง๋ง ์ถ์ํ์ง ์์๋ค๋ฉด ํ ์ค์ ๋ง์ต๋๋ค. ๊ฐ๋ ์ฑ์ ์ํด ๋ค์ค์ผ๋ก. ํ ์ค์ ๋ชจ๋:
fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))
*bufio.Reader
์์ ํฌํธ๋ฅผ ์ฝ๊ณ TCP ์ฐ๊ฒฐ์ ์์ํ๊ณ ๋์ผํ *bufio.Reader
์ ์ง์ ๋ ๋ฐ์ดํธ ์๋ฅผ stdout
์ ๋ณต์ฌํฉ๋๋ค. ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๊ทธ๋ฐ ์๊ฒฉํ ์ฝ๋ฉ ๊ท์น์ ๊ฐ์ง ์ธ์ด์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ค์ ๋ก ํ์ฉ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง gofmt
์ด ๋ฌธ์ ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ์๊ฒฉํ ์ฝ๋ฉ ๊ท์น์ ๊ฐ์ง ์ธ์ด์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ค์ ๋ก ํ์ฉ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
Go์์๋ ํ์ค์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋์ฐํ๊ฒ ํฌ๋งทํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ํ๋ ๊ฐ๋ ฅํ ๊ท๋ฒ๊ณผ ๋๊ตฌ๊ฐ ์์ ๋ฟ์
๋๋ค. Go ์๋ goto
๊ฐ ์์ต๋๋ค.
์ฝ๋๋ฅผ ๊ฒํ ํ๋ ๋์ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ ์ค๊ฐ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ํํ์์ ์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๋๋๋๋ก ์์ฒญํฉ๋๋ค. ๊ฐ์ ์ด์ ๋ก ๊น๊ฒ ์ค์ฒฉ๋ try
์ ๋ํด์๋ ๋น์ทํ ์์
์ ์ํํฉ๋๋ค.
์ด๊ฒ์ด ์ ๋ถ์ ๋๋ค. ์ธ์ด๋ฅผ ์๊ณกํ๋ ๋๊ฐ๋ก ๋์ ์ฝ๋๋ฅผ ๋ถ๋ฒํํ๊ธฐ ์ํด ๋๋ฌด ์ด์ฌํ ๋ ธ๋ ฅํ์ง ๋ง์. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ก๋ณ๋ก ์ฌ๋์ ํ๋จ์ ํฌํจํ๋ ๊ฒ์ ๋ ์ ํฉํ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
Go์์๋ ํ์ค์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋์ฐํ๊ฒ ํฌ๋งทํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ํ๋ ๊ฐ๋ ฅํ ๊ท๋ฒ๊ณผ ๋๊ตฌ๊ฐ ์์ ๋ฟ์ ๋๋ค. Go์๋ goto๊ฐ ์์ต๋๋ค.
์ฝ๋๋ฅผ ๊ฒํ ํ๋ ๋์ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ ์ค๊ฐ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ํํ์์ ์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๋๋๋๋ก ์์ฒญํฉ๋๋ค. ๊ฐ์ ์ด์ ๋ก ๊น๊ฒ ์ค์ฒฉ๋ ์๋์ ๋ํด์๋ ๋น์ทํ ์์ ์ ์ํํฉ๋๋ค.
์ด๊ฒ์ด ์ ๋ถ์ ๋๋ค. ์ธ์ด๋ฅผ ์๊ณกํ๋ ๋๊ฐ๋ก ๋์ ์ฝ๋๋ฅผ ๋ถ๋ฒํํ๊ธฐ ์ํด ๋๋ฌด ์ด์ฌํ ๋ ธ๋ ฅํ์ง ๋ง์. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ก๋ณ๋ก ์ฌ๋์ ํ๋จ์ ํฌํจํ๋ ๊ฒ์ ๋ ์ ํฉํ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค.
์ด๊ฒ์ ์ข์ ์ ์
๋๋ค. ๋์ ์ฝ๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ค๋ ์ด์ ๋ง์ผ๋ก ์ข์ ์์ด๋์ด๋ฅผ ๋ถ๋ฒํํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋์ ์ฝ๋๋ฅผ ์ด์งํ๋ ๋์์ด ์๋ค๋ฉด ์ข์ ์๊ฐ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. @ianlancetaylor ์ ์๊ฒฌ์ด ๋์ฌ ๋๊น์ง try
๋ค์ ์๋ ์์ ์์ด๋์ด๋ฅผ ์ง์ ๋ก(๋ชจ๋ else { ... }
์ ํฌ ์์ด) _๋ฐ๋_ ๋ง์ ์ด์ผ๊ธฐ๋ฅผ ๋ณธ ์ ์ด ์์ง๋ง ๋ฐฉ๊ธ ๋์ณค์ ์ ์์ต๋๋ค.
๋ํ ๋ชจ๋ ์ฌ๋์๊ฒ ์ฝ๋ ๊ฒํ ์๊ฐ ์๋ ๊ฒ์ ์๋๋ฉฐ ์ผ๋ถ ์ฌ๋๋ค(ํนํ ๋จผ ๋ฏธ๋์)์ ๊ฒํ ๋์ง ์์ Go ์ฝ๋๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค. Go as a language๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ ๋ชจ๋ ์์ฑ๋ ์ฝ๋๊ฐ ์ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋๋ก(์ ์ด๋ go fmt
์ดํ) ๋งค์ฐ ์ข์ ์ผ์ ํฉ๋๋ค. ์ด๋ ๊ฐ๊ณผํ ์์
์ด ์๋๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง, ๋๋ ์ด ์์ด๋์ด๊ฐ ์ ๋ง๋ก ๋์ฐํ์ง ์์ ๋ ๋งค์ฐ ๋นํ์ ์ ๋๋ค.
Try as ๋ฌธ์ ์์ฉ๊ตฌ๋ฅผ ํฌ๊ฒ ์ค์ด๋ฉฐ, else ๋ธ๋ก์ด๋ ์ค๋ฅ ํธ๋ค๋ฌ๋ฅผ ํ์ฉํ์ง ์๊ณ ๋ ์ด์ ์ ์ ์๋ ๋๋ก ํํ์ ๋ธ๋ก์์ ์๋ํ๋๋ก ํ์ฉํ๋ฉด ํํ์์ผ๋ก try ์ด์์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉํ์ฌ deandeveloper์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try (
name := FileName()
file := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
port := r.ReadString("\n")
lengthStr := r.ReadString("\n")
length := strconv.Atoi(lengthStr)
con := net.Dial("tcp", "localhost:"+port)
io.CopyN(os.Stdout, con, length)
)
๋ชฉํ๊ฐ if err!= nil {return err}
์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ผ๋ฉด ์ฝ๋ ๋ธ๋ก์ ํ์ฉํ๋ try ๋ฌธ์ด ๋ช
ํํ์ง ์๊ณ ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@beoran ๊ทธ ์์ ์์ ์ ์๋๋ฅผ ํ์๊น์? ๋ง์ง๋ง ์ค๋ฅ ๊ฐ์ด ๋๋ฝ๋ ํ ๋น์ ํ์ฉํ๊ณ ๊ทธ๊ฒ์ด try ๋ฌธ(๋๋ ํจ์ ํธ์ถ)์ธ ๊ฒ์ฒ๋ผ ๋์ํ๋๋ก ํ์ญ์์ค. ๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ ์๋์ง๋ง ์์ฉ๊ตฌ๋ฅผ ํจ์ฌ ๋ ์ค์ผ ์ ์์ต๋๋ค.
์ด๋ฌํ var ๋ธ๋ก์ ์ํด ์์ฉ๊ตฌ๊ฐ ํจ์จ์ ์ผ๋ก ์ค์ด๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ด๋ก ์ธํด ์์ฒญ๋ ์์ ์ฝ๋๊ฐ ์ถ๊ฐ ์์ค ๋ค์ฌ์ฐ๊ธฐ๋ก ์ด์ด์ง ์ ์์ด ์ํ๊น์ต๋๋ค. ์ด๋ ๋ถํํ ์ผ์ ๋๋ค.
@deanveloper
fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))
๋๋ ๋๋ฅผ ์ํด ์ฝ์ ์ ์์์ ์ธ์ ํด์ผ ํฉ๋๋ค.
fullContents := try(io.CopyN(os.Stdout,
try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))),
try(strconv.Atoi(try(r.ReadString("\n"))))))
๊ฐ๋ ์ฑ์ ์ํด ์ ์ฌํ๊ฑฐ๋ ๋ชจ๋ ์ค์ ์์ ๋ถ๋ถ์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ์๋ "์๋"๋ก ๋์๊ฐ๋๋ค.
๊ธ์์, ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ ํ ํ์ ํธํ์ฑ์ ์ํ ์๋๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๋ธ๋ก์์ ๋ฐ์ํ ์ ์๋ ๋ฐํ์ ๋ํด ๋ช ์์ ์ด์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ค์ด๊ณ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๋ฅผ ์ด๋๋ก ์ด๋๋์ง ๋ณด๋ ๋ ผ๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ๋๋ค. ์์ฉ๊ตฌ ๊ฐ์์ ๋ช ํ์ฑ ์ฌ์ด์๋ ํญ์ ๊ธด์ฅ์ด ์์ต๋๋ค. ๋๋ ์ด ๋ฌธ์ ์์ ๋น๋ฉดํ ์ฃผ์ ๋ฌธ์ ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ท ํ์ด ์ด๋์ ์์ด์ผ ํ๋์ง์ ๋์ํ์ง ์๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์ฌ์ฐ๊ธฐ์ ๊ดํด์๋ ๊ทธ๊ฒ์ด go fmt์ ๋ชฉ์ ์ด๋ฏ๋ก ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ ๋ค๋ฅธ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์ธ๊ธํ๊ธฐ ์ํด ์ธ์์ ์ฐธ์ฌํ๊ณ ์ถ์ต๋๋ค. ๊ฐ๊ฐ์ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก ๋ณ๋์ ๊ฒ์๋ฌผ์ ๋ณด๊ดํ๊ฒ ์ต๋๋ค.
try()
(์ธ์ ์์)์ด ์ค๋ฅ ๋ฐํ ๋ณ์์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋๋ก ์ ์๋ ์ ์๋ค๋ ์ ์์ ํฅ๋ฏธ๋ก์ด ์ ์์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ฐ ์ข
๋ฅ์ ๋ง์ฅ๋์๋ ๊ด์ฌ์ด ์์์ต๋๋ค. , Go๊ฐ ํผํ๋ ๊ฒ.
๊ทธ๋ฌ๋ ๋ก์ปฌ ์ค๋ฅ ๊ฐ์ ์ฐธ์กฐํ๋ ๋ฏธ๋ฆฌ ์ ์๋ ์๋ณ์์ ์ผ๋ฐ์ ์ธ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด err
์๋ณ์ ์์ฒด๋ฅผ ์ค๋ฅ ๋ฐํ ๋ณ์์ ๋ณ์นญ์ผ๋ก ๋ฏธ๋ฆฌ ์ ์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋ฐ๋ผ์ ์ด๊ฒ์ ์ ํจํฉ๋๋ค.
func foo() error {
defer handleError(&err, etc)
try(something())
}
๋ค์๊ณผ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผํฉ๋๋ค.
func foo() (err error) {
defer handleError(&err, etc)
try(something())
}
err
์๋ณ์๋ ํจ์ ๋ก์ปฌ ๋ณ์นญ์ผ๋ก ์๋ํ๋๋ผ๋ ์ ๋๋ฒ์ค ๋ฒ์์์ ์ ์๋๋ฏ๋ก err
์ ๋ชจ๋ ํจํค์ง ์์ค ์ ์ ๋๋ ํจ์ ๋ก์ปฌ ์ ์๊ฐ ์ด๋ฅผ ์ฌ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ์ํํด ๋ณด์ผ ์ ์์ง๋ง ๋ฐ๋ ์ฝํผ์ค ์์ ๋ฐ๋์ 22m ๋ผ์ธ์ ์ค์บํ๋๋ฐ ๋งค์ฐ ๋๋ญ
๋๋ค. err
์ ์ญ์ผ๋ก ์ฌ์ฉ๋๋ ๊ณ ์ ํ ์ธ์คํด์ค๋ 4๊ฐ๋ฟ์
๋๋ค(๋ชจ๋ ์ ํ์ด๋ ์์๊ฐ ์๋ ๋ณ์๋ก ์ฌ์ฉ) - ์ด๊ฒ์ vet
๊ฒฝ๊ณ ํ ์ ์๋ ๊ฒ์
๋๋ค.
๋ฒ์์ ๋ ๊ฐ์ ํจ์ ์ค๋ฅ ๋ฐํ ๋ณ์๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ชจํธ์ฑ์ด ์๋ค๊ณ ๋ถํํ๊ณ ์ฌ์ฉ์๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐํ ๋ณ์์ ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์ ํจํ์ง ์์ต๋๋ค.
func foo() error {
f := func() error {
defer handleError(&err, etc)
try(something())
return nil
}
return f()
}
๊ทธ๋ฌ๋ ํญ์ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
func foo() error {
f := func() (err error) {
defer handleError(&err, etc)
try(something())
return nil
}
return f()
}
try
๋ฅผ ์ฐ์ฐ์๊ฐ ์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์๋ณ์๋ก ์ฃผ์ ๋ก,
๋๋ ๊ธ์ ์ธ ๋ ๋๊ดํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ฆฌ๊ฒ ํ ํ ํ์๋ฅผ ์ ํธํ๋ ๊ฒฝํฅ์ด ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
try(try(os.Create(filename)).Write(data))
"์ Rust๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?"์์ FAQ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ๋ชจํธํ๊ฑฐ๋ ๋ถ๋ถ๋ช ํ ์๋ฏธ๋ฅผ ๊ฐ๋ ?์ ๊ฐ์ ํน์ดํ ์ฐ์ฐ์๋ฅผ ํฌํจํ์ฌ ์ธ์ด์์ ๋ชจํธํ ์ฝ์ด ๋๋ ๊ธฐํธ๋ฅผ ํผํ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ธ์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. .()
์ฐ์ฐ์๋ ์ฑ๋ ์ฐ์ฐ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋์ ์๊ธฐ ์ ๊น์ง๋ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. ?
์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋จธ์ง ์์ ์ ๋น์ฟผํฐ์คํ๋์ด ํฐ ์ฅ๋ฒฝ์ด ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
๊ทธ๋ฌ๋ Rust ?
์ฐ์ฐ์๋ ํจ์ ํธ์ถ์ ๋ซ๋ ๊ดํธ ๋ค์ ์ถ๊ฐ๋๋ฉฐ, ์ด๋ ์ธ์ ๋ชฉ๋ก์ด ๊ธธ๋ฉด ๋์น๊ธฐ ์ฝ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
?()
๋ฅผ ํธ์ถ ๊ตํ์์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๋ฐ๋ผ์ ๋์ :
x := try(foo(a, b))
๋น์ ์ ํ ๊ฒ์ ๋๋ค :
x := foo?(a, b)
?()
์ ์๋ฏธ๋ ์ ์๋ try
๋ด์ฅ์ ์๋ฏธ์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ํธ์ถ๋๋ ํจ์๋ ๋ฉ์๋๊ฐ ๋ง์ง๋ง ์ธ์๋ก ์ค๋ฅ๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ํจ์ ํธ์ถ์ฒ๋ผ ์๋ํฉ๋๋ค. try
์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ ?()
๋ฌธ์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ ผ์๊ฐ ์ถฉ๋ถํ ์ง์ค๋์ด ์ด์ ์ ์ ์๋๊ณ ๋ ผ์๋ ์ ์ถฉ์์ ๋๋ฌ์ธ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ํํ์ด ์ด ์ธ์ด์ ์ ์ ์ ๋งค์ฐ ๋ง์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ด๋ ๋์๊ฒ๋ ๊ณ ๋ฌด์ ์ ๋๋ค.
@ianlancetaylor ๋๋ ์ฐ๋ฆฌ๊ฐ try
์ ๋์ฌ๋ก ๋๋๋ ์์ญ ๊ฐ์ ๋ผ์ธ์ผ๋ก ๋๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ ๋์ ์ผ๋ก ์ธ์ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ return
ํํ์์ ๋ช
์์ ์ผ๋ก ๋ช
์ํ๋ 2-4ํ ์กฐ๊ฑด์์ ์ํด ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ ์์ญ ํ๋ณด๋ค ๋ ๋์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ค์ ๋ก try
( else
์ ํฌํจ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํน๋ณ/๊ธฐ๋ณธ๊ฐ์ด ์๋ ์์
์ ์ํํ ๋ ์ข ๋ ์ฝ๊ฒ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๋ํ ์ ์ ์ ์ผ๋ก re: conditional if
์์ ์ ์ํ try
-as-a-statement: ํจ์ ํธ์ถ์ด ์กฐ๊ฑด๋ถ์ ๊ฐ์ ์ค์ ์๋ ๊ฒ๋ณด๋ค led๋ฅผ ๋ ๋ง์ด ๋ฌป์ด ๋ฒ๋ฆฐ๋ค๊ณ ์๊ฐํฉ๋๋ค. , ์กฐ๊ฑด๋ฌธ ์์ฒด๋ ์ด๋ฏธ ๋ถ๋น๋ ์ค์ ๋งจ ๋์ ์์ผ๋ฉฐ ๋ณ์ ํ ๋น์ ๋ธ๋ก์ผ๋ก ๋ฒ์๊ฐ ์ง์ ๋ฉ๋๋ค(๋ธ๋ก ๋ค์ ํด๋น ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ด ํ์ํจ).
@josharian ์ต๊ทผ์ ์ด๋ฐ ์๊ฐ์ ๊ฝค ํ์ต๋๋ค. ๋ฐ๋์ ์๋ฒฝํจ์ด ์๋ ์ค์ฉ์ฃผ์๋ฅผ ์ถ๊ตฌํ๋ฉฐ, ๋ฐ๋์ ๊ฐ๋ฐ์ ์์น์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํํธ์๋ ๋ฐ๋์ ์ธ ์๋ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ด์ฐฎ์ ๋ฐ๋์ ์ฐ๋ ๊ฒ๋ณด๋ค ์ด๋ ต์ต๋๋ค( ๋๋ถ๋ถ์ ์ฌ๋๋ค์๊ฒ ์ถฉ๋ถํจ). ๋ํ ์ง์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ gofmt
๋ฐ go vet
๋ฟ๋ง ์๋๋ผ ๋๋ฃ์ ์ด ์ปค๋ฎค๋ํฐ๊ฐ ์ค์ค๋ก๋ฅผ ์๋ดํ๊ธฐ ์ํด (๋งค์ฐ ์ ์คํ๊ฒ) ๋ง๋ ๋ฌธํ์ ๊ฐ์ด ์๋ชป๋ ์ฝ๋๋ฅผ ํด์นํ ์ ์๋ ๋ง์ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ ๋๊ตฐ๊ฐ๊ฐ ์ด๋๊ฐ์์ ์ค์ค๋ก๋ฅผ ๊ณต๊ฒฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋์์ด ๋๋ ๊ฐ์ ์ฌํญ์ ํผํ๊ณ ์ถ์ง ์์ต๋๋ค.
@beoran ์ด๊ฒ์ ์ฐ์ํ๊ณ ์๊ฐํ ๋ ์ค์ ๋ก ๋ค๋ฅธ ์ธ์ด์ try
๋ธ๋ก๊ณผ ์๋ฏธ์ ์ผ๋ก ๋ค๋ฆ
๋๋ค. ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ ์ฒ๋ฆฌ๋์ง ์์ ์ค๋ฅ๋ก ํจ์์์ ๋ฐํํ๋ ๊ฒ๋ฟ์
๋๋ค. ๊ทธ๋ฌ๋: 1) ์ด๊ฒ์ ์๋ง๋ ๋ค๋ฅธ ์ธ์ด๋ก ์์
ํ ์๋ก์ด Go ์ฝ๋์๊ฒ ํผ๋์ ์ค ๊ฒ์
๋๋ค(์์งํ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ ์๋๋๋ค. ์ ๋ ํ๋ก๊ทธ๋๋จธ์ ์ง๋ฅ์ ๋ฏฟ์ต๋๋ค). ์ฝ๋๋ฒ ์ด์ค. ๋ด ์ฝ๋์ ๊ดํ ํ ์ด๋ฌํ ์ด์ ๋ก ๊ธฐ์กด type
/ const
/ var
๋ธ๋ก์ ํผํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋ํ ํ์ฌ ์ด์ ๊ฐ์ ๋ธ๋ก์ ํ์ฉํ๋ ์ ์ผํ ํค์๋๋ ์ ์ด๋ฌธ์ด ์๋๋ผ ์ ์์
๋๋ค.
@yiyus ๋ช
์์ฑ์ (๋ด ์๊ฐ์) Go์ ๋ฏธ๋ ์ค ํ๋์ด๊ธฐ ๋๋ฌธ์ ํค์๋ ์ ๊ฑฐ์ ๋์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ try
ํํ์์ ํ์ฉํ๊ธฐ ์ํด ์์ฒญ๋ ์์ ์ฝ๋๋ฅผ ๋ค์ฌ์ฐ๋ ๊ฒ์ ๋์ ์๊ฐ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด try
๋ธ๋ก์ด ์ ํ ์์ ์ ์์ต๋๊น?
@rogpeppe ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฏธ๋ฌํ ์ฐ์ฐ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์์์ผ ํ๋ ํธ์ถ์ ๋ํด์๋ง ํฉ๋ฆฌ์ ์ด๋ฉฐ ๊ทธ๋ ๊ฒ ํ๋ฉด ํจ๋์ด ๋ฐ์ํฉ๋๋ค. ๋๋ ํญ์ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ํธ์ถ. ๊ทธ๋ฌ๋ ๋ ๋ค ๋๋ฌธ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ก์ด ๊ตํ์์๊ฒ ์ด๋ ค ์๋ ๊ฒฝ์ฐ #32500์ ์ฐธ์กฐํ์ญ์์ค.
๋๋ f(try g())
๊ฐ 1์ค ์ฒ๋ฆฌ stmt์ ํจ๊ป https://github.com/golang/go/issues/32437#issuecomment -501074836์์ ํจ๋ํด์ผ ํ๋ค๊ณ ์ ์ํ์ต๋๋ค.
on err, return ...
try ... else { ... }
์ ์ ํ์ else
๋ ์ฝ๋๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฌด ๋ง์ด ๋ฐ์ด ์ฝ๋๋ฅผ ๊ฐ๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ฅ ๋ธ๋ก์ ๋๋ถ๋ถ์ ์๊ฐ์ ์ต์ 25์ ์ด์์ด์ด์ผ ํฉ๋๋ค. ๋ํ ์ง๊ธ๊น์ง ๋ธ๋ก์ go fmt
์ ์ํด ๊ฐ์ ์ค์ ์ ์ง๋์ง ์์์ผ๋ฉฐ ์ด ๋์์ try else
๋์ ์ ์ง๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๋ฐ๋ผ์ else
๋ธ๋ก์ด ๋ณ๋์ ์ค์ ์๋ ์ํ์ ๋
ผ์ํ๊ณ ๋น๊ตํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋์๋ ํ ๋์์ else {
์ ๊ฐ๋
์ฑ์ ๋ํด ํ์ ํ ์ ์์ต๋๋ค.
@yiyus https://github.com/golang/go/issues/32437#issuecomment -501139662
@beoran ๊ทธ ์์ ์์ ์ ์๋๋ฅผ ํ์๊น์? ๋ง์ง๋ง ์ค๋ฅ ๊ฐ์ด ๋๋ฝ๋ ํ ๋น์ ํ์ฉํ๊ณ ๊ทธ๊ฒ์ด try ๋ฌธ(๋๋ ํจ์ ํธ์ถ)์ธ ๊ฒ์ฒ๋ผ ๋์ํ๋๋ก ํ์ญ์์ค. ๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ ์๋์ง๋ง ์์ฉ๊ตฌ๋ฅผ ํจ์ฌ ๋ ์ค์ผ ์ ์์ต๋๋ค.
Go1์ ์ด๋ฏธ func foo() error
๋ฅผ foo()
๋ก ํธ์ถํ๋ ๊ฒ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์ํํ ์ ์์ต๋๋ค. ํธ์ถ์์ ๋ฐํ ๊ฐ์ , error
๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น ํจ์ ๋ด๋ถ์ ๊ธฐ์กด ์ฝ๋ ๋์์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. https://github.com/golang/go/issues/32437#issuecomment -500289410 ์ฐธ์กฐ
@rogpeppe ์ค์ฒฉ try
์ ๊ดํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ๊ทํ์ ์๊ฒฌ์์: try
์ ์ฐ์ ์์์ ๋ํ ์๊ฒฌ์ด ์์ต๋๊น? ์ด ์ฃผ์ ์ ๋ํ ์์ธํ ์ค๊ณ ๋ฌธ์ ๋ ์ฐธ์กฐํ์ญ์์ค.
@griesemer ๋๋ ๊ฑฐ๊ธฐ์์ ์ง์ ํ ์ด์ ๋ก ๋จํญ ์ ๋์ฌ ์ฐ์ฐ์๋ก try
์ ๋ํด ๊ทธ๋ค์ง ์ด๊ดํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ try
๋ฅผ ํจ์ ๋ฐํ ํํ์์ ์์ฌ ๋ฉ์๋๋ก ํ์ฉํ๋ ๊ฒ์
๋๋ค.
f := os.Open(path).try()
๊ทธ๋ ๊ฒ ํ๋ฉด ์ฐ์ ์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค๊ณ ์๊ฐํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ค์ง Go์ ๊ฐ์ง ์์ต๋๋ค.
@rogpeppe
๋งค์ฐ ํฅ๋ฏธ๋ก์ด! . ๋น์ ์ ์ ๋ง๋ก ์ฌ๊ธฐ์์ ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ์์ด๋์ด๋ฅผ ๊ทธ๋ ๊ฒ ํ์ฅํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
for _,fp := range filepaths {
f := os.Open(path).try(func(err error)bool{
fmt.Printf( "Cannot open file %s\n", fp );
continue;
});
}
BTW, ์๋ง๋ guard()
try()
์ ๋ค๋ฅธ ์ด๋ฆ์ ์ ํธํ ์ ์์ง๋ง ์ํคํ
์ฒ๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ํด ๋
ผ์๋๊ธฐ ์ ์ ์ด๋ฆ์ ๋์ฉํด์๋ ์๋ฉ๋๋ค.
๋ :
for _,fp := range filepaths {
if f,err := os.Open(path);err!=nil{
fmt.Printf( "Cannot open file %s\n", fp )
}
}
?
$ if err!=nil {return err}
try a,b := foo()
๊ฐ ๋ง์์ ๋ญ๋๋ค. ์ ๋ง ๊ฐ๋จํ ๊ฒฝ์ฐ์ ์์ฉ๊ตฌ๋ฅผ ๋์ฒดํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ํด if err!=nil {...}
(๋ ๋์ ๊ฒ์ ์ฐพ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค) ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ด ์ ๋ง๋ก ํ์ํฉ๋๊น?
์ผ๋ฐ์ ์ผ๋ก ์ฅ์/ํฌ์ฅ์ ์ถ๊ฐ ์ค์ด ํ์ํ ๊ฒฝ์ฐ ํด๋น ์ค์ "ํ ๋น"ํฉ๋๋ค.
f, err := os.Open(path) // normal Go \o/
on err, return fmt.Errorf("Cannot open %s, due to %v", path, err)
@networkimprov ๋๋ ๊ทธ๋ฐ ๊ฑธ ์ข์ํ ์ ์์ ๊ฒ ๊ฐ์. ๋ด๊ฐ ์ด๋ฏธ ์ ๊ธฐํ ๋ ๋์ด์ ์ด๊ณ ์์ ์ ์ธ ์ฉ์ด๋ฅผ ๋ฐ์ด๋ถ์ด๋ ๊ฒ์...
f, err := os.Open(path)
relay err { nil, fmt.Errorf("Cannot open %s, due to %v", path, err) }
// marginally shorter, doesn't trigger vertical formatting unless excessively wide
// enclosed expression restricted to a list of values that match the return args
๋๋
f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)
// somewhere between statement and func, prob more pleasing to type w/out completion
// trailing expression restricted to a list of values that match the return args
// maybe excessive width triggers linting noise - with a reformatter available
// providing a reformatter would make swapping old (narrow enough) code easy
@daved ๋ง์์ ๋์ ๋ค๋ ๋คํ์
๋๋ค! on err, ...
๋ ๋ชจ๋ ๋จ์ผ stmt ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํฉ๋๋ค.
err := f() // followed by one of
on err, return err // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err) // doesn't stop the function
on err, continue // retry in a loop
on err, hname err // named handler invocation without parens
on err, ignore err // logs error if handle ignore() defined
handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
if err == io.Bad { return err } // non-local return
fmt.Println(clr, err)
}
ํธ์ง: on
๋ Javascript์์ ์ฐจ์ฉํฉ๋๋ค. if
๊ณผ๋ถํ๋ฅผ ์ํ์ง ์์์ต๋๋ค.
์ผํ๋ ํ์๋ ์๋์ง๋ง ์ธ๋ฏธ์ฝ๋ก ์ ์ข์ํ์ง ์์ต๋๋ค. ์๋ง๋ ๊ฒฐ์ฅ?
๋๋ relay
๋ฅผ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค ; ์ค๋ฅ ์ ๋ฐํ์ ์๋ฏธํฉ๋๊น?
์ด๋ค ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ๋ณดํธ ๊ณ์ ๊ธฐ๊ฐ ํธ๋ฆฝ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ค๋ฅ ๊ฐ์ด 0์ด ์๋ ๊ฒฝ์ฐ ๋ฆด๋ ์ด๋ ํ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฐํํ๋๋ก ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํฉ๋๋ค.
*์ด ๊ฒฝ์ฐ ,
๋ฅผ ์ค๋ฒ๋ก๋ํ๊ณ ์ถ์ง ์๊ณ on
์ฉ์ด์ ํฌ์ด ์๋์ง๋ง ์ฝ๋ ๊ตฌ์กฐ์ ์ ์ ์ ์ ์ฒด ๋ชจ์์ด ๋ง์์ ๋ญ๋๋ค.
์์ @josharian ์ ์์ ์ ๋ฐ๋ฅด๋ฉด ๊ดํธ ์ผ์น์ ๋ํ ๋
ผ์์ ์๋น ๋ถ๋ถ์ด ๋๋ถ๋ถ ๊ฐ์ค์ ์ด๊ณ ์ธ์์ ์ธ ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋น์ ์ ๋ํด ๋ชจ๋ฅด์ง๋ง ๋ด ์ผ์์ ์ธ ํ๋ก๊ทธ๋๋ฐ์์ ํจ์ ํธ์ถ์ ์์ฑํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์์ง๋ ์์ต๋๋ค. ํํ์ด ์ฝํ๊ฑฐ๋ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ง์ ์ ๋๋ฌํ๋ฉด ์ค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํํ์ผ๋ก ๋๋๋๋ค. ํจ์ ํธ์ถ ๊ตฌ๋ฌธ์ด ์๋ try()
๊ฐ ์ค์ ๋ก ์ด์ ๊ด๋ จํ์ฌ ์ ๋ค๋ฅธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@eandre ์ผ๋ฐ์ ์ผ๋ก ํจ์์๋ ์ด๋ฌํ ๋์ ์ ์๊ฐ ์์ต๋๋ค. ์ด ์ ์์ ๋ง์ ํํ๋ ์ ์ด ํ๋ฆ์ ํต์ ์ ๋๋ฌ์ผ ์์ ์ฑ์ ๊ฐ์์ํค๋ฉฐ ์ด๋ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
@networkimprov @daved ์ด ๋ ๊ฐ์ง ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง๋ ์์ง๋ง, ๋จ์ํ ํ ์ค if err != nil { ... }
๋ช
๋ น๋ฌธ์ด ์ธ์ด ๋ณ๊ฒฝ์ ๋ณด์ฆํ๋๋ก ํ์ฉํ๋ ๊ฒ๋ณด๋ค ๊ฐ์ ์ด ์ถฉ๋ถํ๋ค๊ณ ๋๊ปด์ง์ง ์์ต๋๋ค. ๋ํ ๋จ์ํ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋ฐ๋ณต์ ์ธ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด๋ค ์์
์ ์ํํฉ๋๊น? ์๋๋ฉด ํญ์ return
๋ฅผ ์จ์ผ ํ๋ค๋ ์๊ฐ์
๋๊น?
@brynbellomy ๋ด ์์๋ return
๊ฐ ์์ต๋๋ค. relay
๋ "์ด ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ ๋ค์์ด ๋ฐํ๋จ"์ผ๋ก ์ ์๋ ๋ณดํธ ๊ณ์ ๊ธฐ์
๋๋ค.
์ด์ ์ ๋ ๋ฒ์งธ ์๋ฅผ ์ฌ์ฉํ์ฌ:
f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)
๋ค์๊ณผ ๊ฐ์ ์๋ ์์ต๋๋ค.
f, err := os.Open(path)
relay(err)
๋ค๋ฅธ ๋ฐํ ๊ฐ(๋๋ ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ๋ํด ์ค์ ๋ ๊ฐ)์ ๋ํด 0 ๊ฐ๊ณผ ํจ๊ป ๋ฐํ๋๋ ๋ฆด๋ ์ด๋ฅผ ํธ๋ฆฝํ๋ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ ์ฉํ ์ ์๋ ๋ ๋ค๋ฅธ ํ์:
wrap := func(err error, msg string) error {
if err != nil {
fmt.Errorf("%s: %s", msg, err)
}
return nil
}
// ...
f, err := os.Open(path)
relay(err, wrap(err, fmt.Sprintf("Cannot open %s", path)))
๋ฆด๋ ์ด๊ฐ ์ฒซ ๋ฒ์งธ ๋ฆด๋ ์ด arg์ ์ํด ํธ๋ฆฝ๋์ง ์๋ ํ ๋ ๋ฒ์งธ ๋ฆด๋ ์ด arg๊ฐ ํธ์ถ๋์ง ์๋ ๊ฒฝ์ฐ. ์ ํ์ ๋ ๋ฒ์งธ ๋ฆด๋ ์ด ์ค๋ฅ arg๋ ๋ฐํ๋ ๊ฐ์ ๋๋ค.
_go fmt_ ๋จ์ผ ํ if
๋ ํ์ฉํ์ง๋ง case, for, else, var ()
๋ ํ์ฉํ์ง ์์์ผ ํฉ๋๊น? ๋ชจ๋ ๋ถํ๋๋ฆฝ๋๋ค ;-)
Go ํ์ ํ ์ค ์ค๋ฅ ๊ฒ์ฌ์ ๋ํ ๋ง์ ์์ฒญ์ ๊ฑฐ์ ํ์ต๋๋ค.
on err, return err
๋ฌธ์ ๋ฐ๋ณต์ ์ผ ์ ์์ง๋ง ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ๋ช
ํํฉ๋๋ค.
@magical ๊ทํ์ ํผ๋๋ฐฑ ์ ์ธ๋ถ ์ ์์ ์ ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์์ ํด๊ฒฐ๋์์ต๋๋ค.
์์ ์ผ์ด์ง๋ง try
๊ฐ ํค์๋์ธ ๊ฒฝ์ฐ ์ข
๋ฃ ๋ฌธ์ฅ์ผ๋ก ์ธ์๋ ์ ์์ผ๋ฏ๋ก ๋์
func f() error {
try(g())
return nil
}
๋น์ ์ ๊ทธ๋ฅ ํ ์ ์์ต๋๋ค
func f() error {
try g()
}
( try
-statement๋ ๋ฌด๋ฃ๋ก ์ ๊ณต๋ฉ๋๋ค. try
-operator๋ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์์ ์๊ฐ ์ข์ ์๋ ์๋์ง๋ง ์ต์ํ์ ๊ฒ์
๋๋ค.)
@jimmyfrasche try
๋ ํค์๋๊ฐ ์๋๋๋ผ๋ ์ข
๋ฃ ๋ฌธ์ฅ์ผ๋ก ์ธ์๋ ์ ์์ต๋๋ค. ์ด๋ฏธ panic
๋ก ๊ทธ๋ ๊ฒ ํ๊ณ ์์ต๋๋ค. ์ด๋ฏธ ํ๊ณ ์๋ ๊ฒ ์ธ์ ์ถ๊ฐ๋ก ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ ์ ์ ์ธํ๊ณ try
๋ ์ข
๋ฃ ๋ฌธ์ฅ์ด ์๋๋ฉฐ ์ธ์์ ์ผ๋ก ๋ง๋ค๋ ค๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์
๋๋ค.
๋ชจ๋ ์ ํจํ ํฌ์ธํธ. ์ธ๋ถ ์ ์์์ CopyFile
์ ๊ฐ์ด ์ค๋ฅ๋ง ๋ฐํํ๋ ํจ์์ ๋งจ ๋ง์ง๋ง ์ค์ด๊ฑฐ๋ try(err)
๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋ง ์ข
๋ฃ ๋ช
๋ น๋ฌธ์ผ๋ก ์์ ์ ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. if
err != nil
์์. ๊ทธ๋ด ๊ฐ์น๊ฐ ์์ด ๋ณด์ธ๋ค.
์ด ์ค๋ ๋๊ฐ ์ ์ ๊ธธ์ด์ง๊ณ ๋ฐ๋ผ๊ฐ๊ธฐ๊ฐ ์ด๋ ค์์ง๊ธฐ ๋๋ฌธ์(๊ทธ๋ฆฌ๊ณ ์ด๋ ์ ๋ ๋ฐ๋ณต๋๊ธฐ ์์ํจ) " ๋ชจ๋ ์ ์์ด ์ ๊ณตํ๋ ์ฅ์ ์ค ์ผ๋ถ์ ๋ํด ํํํด์ผ ํ๋ค๋ ๋ฐ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋์ํ ๊ฒ์ ๋๋ค.
์์์ ์ ์๋ ์ฝ๋ ์์ด์ ๊ณ์ํด์ ์ข์ํ๊ฑฐ๋ ์ซ์ดํ ๋ "์ด๊ฒ์ด ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๋ ํฉ๋ฆฌ์ ์ธ ํํ์ธ๊ฐ/์ด๋ฏธ ์ ์๋ ๊ฒ"์ด๋ผ๋ ์ง์ ํ ์๋ฏธ๋ฅผ ์ป๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
"์๋" ๋ณํ ๋ฐ ๋์ฒด ์ ์์ ํ๊ฐํ๋ ๊ฐ๊ด์ ์ธ ๊ธฐ์ค์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก ๊ธ์ง์ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๊ท์น(์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์์)์ ์ค์ ํ๊ณ "๋งค๋ ฅ์ ์ผ๋ก ๋ณด์ด๋์ง/์ง๊ฐ์ ์ธ์ง ๋ฑ"์ ๋ํ ํ์ ์์ญ์ ๋จ๊ธธ ์ ์์ต๋๋ค(์์ "ํ๋" ๊ธฐ์ค๋ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ ์ ์์ต๋๋ค.. .).
์ด ๋ชฉ๋ก์ ๋ํด ์ ์์ ํ
์คํธํ๊ณ ๊ฐ ํฌ์ธํธ(๋ณด์ผ๋ฌ ํ๋ ์ดํธ 5ํฌ์ธํธ, ๊ฐ๋
์ฑ 4ํฌ์ธํธ ๋ฑ)๋ฅผ ํ๊ฐํ๋ฉด ๋์ ๋ค์์ ์ ๋ ฌํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ต์
์ ์๋ง๋ A,B,C์ผ ๊ฒ์ด๊ณ , ๊ฒ๋ค๊ฐ ์๋ก์ด ์ ์์ ์ถ๊ฐํ๊ณ ์ ํ๋ ์ฌ๋์ ๊ทธ์ ์ ์์ด ๊ธฐ์ค์ ์ถฉ์กฑํ๋์ง (์ด๋ ์ ๋) ํ
์คํธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๋ฉด ์์ง์๊ฐ๋ฝ์ ์น์ผ๋ค๊ณ ์๋ ์ ์์ ๊ฒํ ํด ๋ณผ ์ ์์ต๋๋ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ค๋ฅธ ์ ์ ์ค ์ผ๋ถ๋ ์ฃผ์์ ์ธ๋ผ์ธํ๊ฑฐ๋ ๋งํฌ๋์ด ์์ ์ ์์ผ๋ฉฐ, ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ฐ๊ฑฐ๋ ๋ ๋์ ํ๊ฐ๋ฅผ ๋ฐ์ ์ ์๋ ์กฐํฉ์ ์๊ฐํด ๋ผ ๊ฒ์ ๋๋ค.
๊ธฐ์ค += ํจํค์ง ์ ์ฒด ๋ฐ ๊ธฐ๋ฅ ๋ด์์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ ์ฌ์ฌ์ฉ
์ด ์ ์์ ๋ํ ์ง์์ ์ธ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ ๋ก ์ ํต์ฌ ๋ฌธ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋ฌ์ต๋๋ค. ๋ํ ๋์ฒด ์ ์์ ํด๋นํ๋ ๊ฒ์ ํด์ฑํ๋ 12๋ช ์ ๋์ ๊ธฐ๊ณ ์(์์ ์ด ๋๊ตฌ์ธ์ง ์๊ณ ์์)๊ฐ ์ง๋ฐฐํ๊ฒ ๋์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ _ํน์ _ ์ ์ ์ ๊ดํ ๊ฒ์์ ์น์ ํ๊ฒ ์๋ ค๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฐธ์ ํ ๊ตฌ๋ฌธ๋ก ์ ์์ด๋์ด๋ฅผ ๊ตฌํ๋ ๊ฒ์ด _์๋๋ค_ (์ข์ ์ผ์ด์ง๋ง ์ด๊ฒ์ _์ด_ ๋ฌธ์ ๊ฐ ์๋๋๋ค).
ํ ๋ก ์ ๋ค์ ์ด์ ์ ๋ง์ถ๊ณ ๋ค์ ์ ์ ๊ถค๋์ ์ค๋ฅด๋๋ก ํฉ์๋ค.
ํผ๋๋ฐฑ์ "์ด ์ ์์ ์ด ๊ฒฝ์ฐ์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค" ๋๋ "์ด๋ฌํ ์์๊ฐ ์์์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค"์ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ๋์น ๊ธฐ์ _์ฌ์ค_์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ๋ ๊ฐ์ฅ ์์ฐ์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด, @magical ์ ์์ฑ๋ ์ ์์ด ์ฃผ์ฅ๋งํผ ํ์ฅ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์ง์ ํ์ต๋๋ค (์๋ณธ ํ ์คํธ๋ ๋ฏธ๋์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์์ต๋๋ค). ์ด ์ข๊ฒ๋ ์ด๊ฒ์ ์ ์์ ์ฝ๊ฐ ์กฐ์ ํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ์ฌ์ํ ๋ฌธ์ ์์ต๋๋ค. ๊ทธ์ ์๊ฒฌ์ ์ ์์ ๊ฐ์ ํ๋ ๋ฐ ์ง์ ์ ์ธ ๋์์ด ๋์์ต๋๋ค.
@crawshaw ๋ std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์๋ฐฑ ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ถ์ํ๋ ๋ฐ ์๊ฐ์ ๋ค์๊ณ try
๊ฐ ๋ค๋ฅธ ํํ์ ์์ ๊ฑฐ์ ๋ค์ด๊ฐ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ฏ๋ก try
๊ฐ ๋ฌปํ ๋ณด์ด์ง ์์ ์ ์๋ค๋ ์ฐ๋ ค๋ฅผ ์ง์ ์ ์ผ๋ก ๋ฐ๋ฐํฉ๋๋ค. ์ด๋ ๋งค์ฐ ์ ์ฉํ ์ฌ์ค ๊ธฐ๋ฐ ํผ๋๋ฐฑ์ด๋ฉฐ, ์ด ๊ฒฝ์ฐ ์ค๊ณ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
๋์กฐ์ ์ผ๋ก, ๊ฐ์ธ์ ์ธ _๋ฏธ์ _ํ๋จ์ ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ํผ๋๋ฐฑ์ ๋ฑ๋กํ ์ ์์ง๋ง ๊ทธ๊ฒ์ ๋ฐ๋ผ ํ๋ํ ์ ์์ต๋๋ค(๋ค๋ฅธ ์ ์์ ํ๋ ๊ฒ ์ธ์).
๋์ ์ ์์ ๋ํด: ํ์ฌ ์ ์์ ์๋ ์ค๊ณ ์ด์ ์ ์์์ผ๋ก ๋ง์ ์์ ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์ฐ๋ฆฌ๋ ํด๋น ๋์์ธ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๊ณ ๋ง์ ์ฌ๋๋ค์๊ฒ ํผ๋๋ฐฑ์ ์์ฒญํ ํ ๊ฒ์ํ๊ณ ์ค์ ์คํ ๋จ๊ณ๋ก ์งํํ ๊ฒ์ ๊ถ์ฅํ์ง๋ง ์์ง ์คํ์ ํ์ง ์์์ต๋๋ค. ์คํ์ด ์คํจํ๊ฑฐ๋ ํผ๋๋ฐฑ์์ ๋ถ๋ช ํ ์คํจํ ๊ฒ์ด๋ผ๊ณ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ ๋จ๊ณ๋ก ๋์๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ์ฒซ์ธ์์ ๊ธฐ๋ฐ์ผ๋ก ์ฆ์์์ ์ฌ์ค๊ณํ๋ฉด ๋ชจ๋ ์ฌ๋์ ์๊ฐ์ ๋ญ๋นํ๊ฒ ๋ ๋ฟ ์๋๋ผ ๊ทธ ๊ณผ์ ์์ ์๋ฌด ๊ฒ๋ ๋ฐฐ์ฐ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ ๊ธด ํด๋ ์ด ์ ์์ ๋ํด ๋ง์ ์ฌ๋๋ค์ด ๋งํ๋ ๊ฐ์ฅ ์ค์ํ ์ฐ๋ ค๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ธ์ด์์ ํ ์ ์๋ ๊ฒ ์ธ์ ์ค๋ฅ ์ฅ์์ ๋ช ์์ ์ผ๋ก ๊ถ์ฅํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ํด๋น ํผ๋๋ฐฑ์ ๋ฑ๋กํ์ต๋๋ค. ์ด ์ ์์ ๊ฒ์ํ๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ๋งค์ฐ ๋์ผํ ํผ๋๋ฐฑ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํ ๋์ ์ค ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๋์์ ์์ต๋๋ค. ๋์ ์ฐ๋ฆฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํ ๋ถ๋ถ์ ์ ๋ค๋ฃจ๊ณ ํ์ํ ๊ฒฝ์ฐ ํ์ฅ๋ ์ ์๋ ์ต์ํ์ ์์ด๋์ด๋ฅผ ์ ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ฐ์ฌ ํด์.
(๋์ ์ ์์ ์ง์งํ๋ ๋ ์ฌ๋์ด ๊ฐ์์ ๋ณ๋ ๋ฌธ์ ๋ฅผ ์์ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํฉ๋๋ค. ์ด๋ ์ข์ ์ผ์ด๋ฉฐ ๊ฐ๊ฐ์ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.)
@griesemer
๋๋ ์ฐ๋ฆฌ๊ฐ ์ง์คํด์ผ ํ๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํ๋ฉฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ ๊ธ์ ์ฐ๊ฒ ๋ง๋ ์ด์ ์
๋๋ค.
์ด๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๋ฉด ์์ง์๊ฐ๋ฝ์ ์น์ผ๋ค๊ณ ์๋ ์ ์์ ๊ฒํ ํด ๋ณผ ์ ์์ต๋๋ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
๋ ๊ฐ์ง ์ง๋ฌธ:
LMKWYT.
0 ์ธ์(๋๋ ๋ค๋ฅธ ๋ด์ฅ)๊ฐ ์๋ try()
๋ฅผ ์์ง ๊ณ ๋ ค ์ค์ด๊ฑฐ๋ ์ ์ธ๋์์ต๋๋ค.
์ ์์ ๋ณ๊ฒฝํ ํ์๋ ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์ ๋ "์ผ๋ฐ์ "์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฌ์ ํ ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๋ฐฑ์
ํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค :upside_down_ face:.
0 ์ธ์(๋๋ ๋ค๋ฅธ ๋ด์ฅ)๊ฐ ์๋ try()
๊ฐ ์ ์์ ์ถ๊ฐ๋๋ฉด ์ ์์ ์์ ๊ฐ try()
(๋๋ ๋ค๋ฅธ ๋ด์ฅ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ช
๋ช
๋ ๋ฐํ์ ๋ฐฉ์งํ๋๋ก ์
๋ฐ์ดํธ๋ ์ ์์ต๋๊น?
@guybrand ์ฐฌ์ฑ๊ณผ ๋ฐ๋ ํฌํ๋ _๊ฐ์ _์ ํํํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ๊ฑฐ๊ธฐ์๋ ๋ ์ด์ ์ ๋ณด๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํฌํ์, ์ฆ ๊ฐ์ ๋ง์ผ๋ก ๊ฒฐ์ ์ ๋ด๋ฆฌ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ์ฌ๋(์: 90% ์ด์)์ด ์ ์์ ์ซ์ดํ๋ค๋ฉด ๊ทธ๊ฒ์ ์๋ง๋ ๋์ ์ง์กฐ์ผ ๊ฒ์ ๋๋ค. ์์ผ๋ก ๋์๊ฐ๊ธฐ ์ ์ ํ ๋ฒ ๋ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์๋ํ๋ ๊ฒ์ ๋ง์กฑํ๊ณ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ด๋ํ์ต๋๋ค(์ด ์ค๋ ๋์ ๋ํด ์ธ๊ธํ์ง ๋ง์ธ์).
์์์ ํํํ๋ ค๊ณ ํ๋ ๊ฒ์ฒ๋ผ ์ ์์ ์ด ๋จ๊ณ์์ ๊ฐ์ ์ ๊ธฐ๋ฅ์ ๋ํ ์ค์ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋์ ๋๋ค. ๊ฐ์ ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ํนํ ๊ฐ์ ์ ๋ํ ์ฃผ์ ๋ฅผ ์ค์ ๋ก ๊ฒฝํํ ๊ธฐํ๊ฐ ์์ ๋... :-)
@Goodwine ์๋ฌด๋ ์ค๋ฅ ๊ฐ์ ๋๋ฌํ๊ธฐ ์ํด try()
๋ฅผ ๋ฐฐ์ ํ์ง ์์์ต๋๋ค. _if_ ์ด์ ๊ฐ์ ๊ฒ์ด ํ์ํ์ง๋ง @rogpeppe ๊ฐ ์ ์ํ ๋๋ก ๋ฏธ๋ฆฌ ์ ์ธ๋ err
๋ณ์๋ฅผ ๊ฐ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค(์ ์๊ฐ์๋).
๋ค์ ๋งํ์ง๋ง, ์ด ์ ์์ ์ด๊ฒ์ ๋ฐฐ์ ํ์ง ์์ต๋๋ค. ํ์ํ๋ค๋ฉด ๊ฑฐ๊ธฐ๋ก ๊ฐ์.
@griesemer
์ ๋ฅผ ์์ ํ ์คํดํ์ ๊ฒ ๊ฐ์์.
๋๋ ์ฐฌ์ฑ/๋ฐ๋ ํฌํ ๋๋ ์ด๋ค ์ ์๋ ๊ฒํ ํ์ง ์๊ณ "๋๋ x๋ฅผ ์ข์ํ๋ ๊ฒ๋ณด๋ค ์๊ฒฉํ ๊ธฐ์ค์ ๋ฐ๋ผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๊น?" ' ๋๋ '์์๊ฒ ๋ณด์ด์ง ์๋๋ค'"
๋น์ ์ด ์ด ๊ฒ์์ - ๊ทธ๊ฒ ์ ํํ ๋น์ ์ด ์๊ฐํ๋ ๊ฒ์ ๋๋ค ... ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ด ์๊ฒฌ์ ์ฐฌ์ฑํ์ญ์์ค.
"๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ์ ์์ด ๊ฐ์ ํ๊ณ ์ ํ๋ ๋ชฉํ์ ๋ชฉ๋ก์ ์ค์ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉฐ, ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋
A. ์ถฉ๋ถํ ์๋ฏธ๊ฐ ์๋์ง ํ๋จ
B. ์ ์์ด ํด๊ฒฐํ๋ ค๋ ๋ชฉํ๋ฅผ ์ค์ ๋ก ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋์ง ๊ฒฐ์
C. (๋น์ ์ด ์ถ๊ฐํ๋๋ก) ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ์ง ํ์ธํ๊ธฐ ์ํด ์ถ๊ฐ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ด์ญ์์ค ...
@guybrand ๊ทธ๋ค์ ์ํํ 1.14(?)์์ ํ๋กํ ํ์ ์ ๋ง๋ค๊ณ ์ค์ ์ฌ์ฉ์๋ก๋ถํฐ ํผ๋๋ฐฑ์ ์์งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ๋ถ๋ช ํ ํ์ ํฉ๋๋ค. IOW ๊ฒฐ์ ์ด ๋ด๋ ค์ก์ต๋๋ค.
๋ํ on err, <statement>
์ ๋ํ ํ ๋ก ์ ์ํด #32611์ ์ ์ถํ์ต๋๋ค.
@guybrand ์ฃ์กํฉ๋๋ค. ์, ์์ฉ๊ตฌ ๊ฐ์, ๋น๋ฉดํ ๋ฌธ์ ํด๊ฒฐ ์ฌ๋ถ ๋ฑ๊ณผ ๊ฐ์ ์ ์์ ๋ค์ํ ์์ฑ์ ๊ฒํ ํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ ๋ถ๋ถ์ ํฉ ๊ทธ ์ด์์ ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ๋ด์ผ ํ๋ค. ์ด๊ฒ์ ์์ง๋์ด๋ง์ด๊ณ ์์ง๋์ด๋ง์ ์ง์ ๋ถํฉ๋๋ค. ์ค๊ณ์ ์ํฅ์ ๋ฏธ์น๋ ๋ง์ ์์๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ด์ ์ผ๋ก(๋จ๋จํ ๊ธฐ์ค์ ๋ฐ๋ผ) ์ค๊ณ์ ์ผ๋ถ๊ฐ ๋ง์กฑ์ค๋ฝ์ง ์๋๋ผ๋ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ ํ "์ฌ๋ฐ๋ฅธ" ์ค๊ณ์ผ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ์ ์์์ ๊ฐ๋ณ ์ธก๋ฉด์ ๋ํ ์ผ์ข ์ _๋ ๋ฆฝ์ ์ธ_ ํ๊ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒฐ์ ์ ์ง์งํ๋ ๊ฒ์ ์กฐ๊ธ ์ฃผ์ ํฉ๋๋ค.
(์ด๊ฒ์ด ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ ์ ๋ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.)
๊ทธ๋ฌ๋ ๊ด๋ จ ๊ธฐ์ค๊ณผ ๊ด๋ จํ์ฌ ์ ๋ ์ด ์ ์์ด ํด๊ฒฐํ๋ ค๋ ๋ด์ฉ ์ ๋ถ๋ช ํ ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ฆ, ๊ทํ๊ฐ ์ฐธ์กฐํ๋ ๋ชฉ๋ก์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.
..., ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ค๋ฅ ๊ฒ์ฌ ์ ์ฉ ์์ค ์ฝ๋์ ์์ ์ค์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๊ฐ์ ํ ์ ํ ๊ฐ๋ฅ์ฑ์ ๋์ด๊ธฐ ์ํด ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋์์ ์ฐ๋ฆฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ํ๋ก๊ทธ๋จ ํ ์คํธ์์ ๋ช ์์ ์ผ๋ก ๋ณผ ์ ์๋๋ก ์ ์งํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ค๋ฅ ์ฅ์์ ์ํด ์ธ์ด ๋ณ๊ฒฝ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ defer
๋ฐ ๋ช
๋ช
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์(๋๋ ์ด์ if
๋ฌธ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ํ์์ ์ธ ์ผ์
๋๋ค. ์ธ์ด ๋ณ๊ฒฝ์๋ ๋ง๋ํ ์จ๊ฒจ์ง ๋น์ฉ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฐ๋ฆฌ๋ ๋ง์ ๋
ผํ์๋ค์ด ๋์์ธ์ ์ด ๋ถ๋ถ์ด "์์ ํ ํํธ์๋ค"๊ณ ๋๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์์ ์์ ์ ๋ฐ์ ์ธ ๊ทธ๋ฆผ์์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์๋ ๋ชจ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ฉด์ ์ฐ๋ฆฌ๋ ์์ฉ๊ตฌ๋ฅผ ์์ ๊ธฐ ์ํด ์ธ์ด ๋ณ๊ฒฝ(์ธ์ด ์ง์์ด ์๋๋ผ)์ด ํ์ํ๋ฉฐ try
๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํด๋ผ ์ ์๋ ์ต์ํ์ ๋ณ๊ฒฝ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ช
ํ ๋ชจ๋ ๊ฒ์ด ์ฌ์ ํ ์ฝ๋์ ๋ช
์๋์ด ์์ต๋๋ค.
๋ง์ ๋ฐ์๊ณผ ์์ ์ ์์ด ์๋ ์ด์ ๋ ์ด๊ฒ์ด ๊ฑฐ์ ๋ชจ๋ ์ฌ๋๋ค์ด Go ์ธ์ด๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ญ๊ฐ๋ฅผ ํด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ์ง ์๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋ฐฉ๋ฒ์ ๋์ํฉ๋๋ค.
๋ณธ์ง์ ์ผ๋ก ์ด ์ ์์ ๊ธฐ๋ณธ ์ ๊ณต append()
๊ธฐ๋ฅ๊ณผ ๊ฐ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ฉด์๋ ๊ตฌ์ฒด์ ์ธ ์์ฉ๊ตฌ ์ฌ๋ก์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต "๋งคํฌ๋ก"๋ก ์์ฝ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํน์ id err!=nil { return err }
ํน์ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ฉํ์ง๋ง ๊ทธ๊ฒ์ด ์ ๋ถ์
๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋๋ณ๋ก ๋์์ด๋์ง ์์ผ๋ฉฐ ์ค์ ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋๋ ๋๋ถ๋ถ์ Go ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ข ๋ ๋ง์ ๊ฒ์ ๊ธฐ๋ํ๊ณ ์๋ค๋ ๋๋์ ๋ฐ์๊ณ , ๊ทธ๋์ ์ด ์ค๋ ๋์ ๋
ผ์๊ฐ ๊ณ์ ์งํ๋๊ณ ์์ต๋๋ค.
๊ธฐ๋ฅ์ผ๋ก์๋ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. Go์์๋ ์ด ์์์ ์ธ์ func(... interface{}, error)
๋ฅผ ๊ฐ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋จผ์ ์
๋ ฅํ ๋ค์ ๋ชจ๋ ํจํด์ ๊ฐ๋ณ ๋ฒํธ๋ Go ๋ชจ๋์ ๋ชจ๋ ๊ณณ์ ์์ต๋๋ค.
์๊ฐํ ์๋ก ํ์ฌ์ ์ ์์ด ๋ง์์ ๋ ๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํญ์ if ๋ฌธ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ง๊ธ๊น์ง ์กฐ์ฉํ๊ณ ์ ์คํ๋ฉฐ ๊ฑด์ค์ ์ธ ํ ๋ก ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฅผ ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋๊ณ ๊ฒฐ๊ตญ์๋ ์ถฉ๋ถํ ์ข์ ํ์ฌ GitHub๊ฐ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค ๋ ํ์ํ๊ธฐ ์ฝ๊ณ ์์ ํด์ผ ํ๋ ์ด ์ฃผ์ ์ค๋ ๋์ ๋ค๋ฅธ ๋ณด๊ธฐ๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์์ต๋๋ค. (๋ํ ๋ ๋น ๋ฅด๊ฒ ๋ก๋๋ฉ๋๋ค!) https://swtch.com/try.html์ ์ฐธ์กฐํ์ญ์์ค. ์ ๋ฐ์ดํธ๋ฅผ ์ ์งํ์ง๋ง ๋ถ ๋จ์๊ฐ ์๋ ์ผ๊ด ์ฒ๋ฆฌ๋ก ์ ์งํ๊ฒ ์ต๋๋ค. (์ด๊ฒ์ ์ ์คํ ์๊ฐ์ด ํ์ํ ํ ๋ก ์ด๋ฉฐ "์ธํฐ๋ท ์๊ฐ"์ ๋์์ด ๋์ง ์์ต๋๋ค.)
์ถ๊ฐํ ์๊ฐ์ด ์์ง๋ง ์์์ผ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ํ๋ฒ ๊ฐ์ฌํฉ๋๋ค.
@mishak87 ์ฐ๋ฆฌ๋ ์์ธํ ์ ์์ ์์ ์ด๊ฒ์ ๋ค๋ฃน๋๋ค. "๋ถ๊ท์นํ" ๋ค๋ฅธ ๋ด์ฅ ๊ธฐ๋ฅ( try
, make
, unsafe.Offsetof
๋ฑ)์ด ์์ต๋๋ค. ์ด๊ฒ์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฉ๋์
๋๋ค.
@rsc , ๋งค์ฐ ์ ์ฉํฉ๋๋ค! ์์ง ์์ ์ค์ด๋ผ๋ฉด #id ๋ฌธ์ ์ฐธ์กฐ๋ฅผ ์ฐ๊ฒฐํ์๊ฒ ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ธ๊ผด ์คํ์ผ์ ์ฐ์ธ๋ฆฌํ์ฒด?
์ด๊ฒ์ ์๋ง๋ ์ด์ ์ ๋ค๋ฃจ์ด์ก์ ๊ฒ์ด๋ฏ๋ก ๋ ๋ง์ ๋ ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ ๊ฒ์ ๋ํด ์ฌ๊ณผํ์ง๋ง try builtin ๋ try ... else ์์ด๋์ด์ ๋ํด ์์ ์ ๋งํ๊ณ ์ถ์์ต๋๋ค.
try ๋ด์ฅ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ ์ค์ ์ฝ๊ฐ ์ค๋ง์ค๋ฌ์ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋๋ก ๋๋ฒ๊ทธ ๊ธฐํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ฐํํ๊ธฐ ์ ์ ๋ ๋ง์ ์ค๋ฅ ๊ด๋ จ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ค์ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค.
user := try(getUser(userID))
์๊ฒ
user, err := getUser(userID)
if err != nil {
// inspect error here
return err
}
defer ๋ฌธ์ ์ถ๊ฐํ๋ฉด ๋์์ด ๋ ์ ์์ง๋ง ํจ์๊ฐ ๋ชจ๋ try() ํธ์ถ์ ๋ํด ํธ๋ฆฌ๊ฑฐ๋๋ฏ๋ก ์ฌ๋ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ ์ต์์ ๊ฒฝํ์ด ์๋๋๋ค.
๋์ผํ ํจ์์์ ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ try() ํธ์ถ์ ๋ค์ ์์ฑํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ฑ๊ฐ์ ์ผ์ ๋๋ค.
๋ฐ๋ฉด์ ์ปจํ ์คํธ ๋๋ ๊ฒ์ฌ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด
user := try getUser(userID)
๋์ catch ๋ฌธ์ ์ถ๊ฐํ๊ณ ๊ทธ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง ํผ ๊ฐ๋จํฉ๋๋ค.
user := try getUser(userID) catch {
// inspect error here
}
ํธ๋ค๋ฌ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ผ์์ ์ผ๋ก ๋นํ์ฑํํ๋ ๊ฒ์ catchํ๊ธฐ ์ ์ ์ค์ ๋๊ณ ์ฃผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํฉ๋๋ค.
try()
์ if err != nil
์ฌ์ด๋ฅผ ์ ํํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ฑ๊ฐ์ IMO๋ฅผ ๋๋๋๋ค.
์ด๋ ์ค๋ฅ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋๋ ์ ์ฉ๋ฉ๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ํ๋กํ ํ์ดํํ๋ฉด์ ๋งค์ฐ ๋น ๋ฅด๊ฒ try func()
try()
์์ฑํ ๋ค์ ํ๋ก๊ทธ๋จ์ด ์ฑ์ํด์ง์ ๋ฐ๋ผ ํ์์ ๋ฐ๋ผ ํน์ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋๋ฒ๊น
ํ๋ ๋์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ถ๊ฐ ๊ฒ์ฌ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ์ค.
try()๊ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง๋ง ์ผ์ ์
๋ฌด์์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํ ๋ try ... catch
์ด d ์ผ๋ถ ์ค๋ฅ์ ๊ด๋ จ๋ ์ถ๊ฐ ์ฝ๋๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํด์ผ ํฉ๋๋ค.
๋ํ try()
$๋ฅผ ์ถ๊ฐํ ๋ค์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด if err != nil
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด make()
๋ new()
๋ :=
์ ๊ฐ๋ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. var
. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ ์ฉํ์ง๋ง ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ด ๋ ์ ๊ฑฐ๋ ๋จ์ผ ๋ฐฉ๋ฒ์ด๋ผ๋ ์์ผ๋ฉด ์ข์ง ์์๊น์? ๋ฌผ๋ก ์๋ฌด๋ try๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ์ง ์์ผ๋ฉฐ ์ฌ๋๋ค์ if err != nil์ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ด๊ฒ์ด ์๋ก์ด ๋ณ์๋ฅผ ํ ๋นํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Go์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ถํ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ธ์ด์ ์ด๋ค ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๋ ์ง ์ฌ๋๋ค์ด ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ๊ธฐ ์ํด ์ ์ฒด ํ์ ๋ค์ ์์ฑํ๋๋ก ํ๋ ๋์ ์ค๋ฅ ํธ๋ค๋ฌ๋ฅผ ์ฝ๊ฒ ์ถ๊ฐ/์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ๋ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ข์ ๊ฒฐ๊ณผ์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค.
๋ค์ ํ ๋ฒ ์ก์์ ๋ํด ์ฃ์กํ์ง๋ง ๋๊ตฐ๊ฐ try ... else
์์ด๋์ด์ ๋ํด ๋ณ๋์ ์ธ๋ถ ์ ์์๋ฅผ ์์ฑํ๊ณ ์ถ์ดํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ์ง์ ํ๊ณ ์ถ์์ต๋๋ค.
//cc @brynbellomy
@owais๋ , ๋ค์ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ ํ๋นํ ์ง์ ์
๋๋ค(๋๋ฒ๊น
๋ฌธ์ ๋ ์ค์ ๋ก ์ด์ ์ ์ธ๊ธ๋ ์ ์ด ์์ต๋๋ค). try
๋ ํธ๋ค๋ฌ ํจ์๊ฐ ๋ ์ ์๋ ๋ ๋ฒ์งธ ์ธ์์ ๊ฐ์ ํ์ฅ์ ์ํด ๋ฌธ์ ์ด์ด๋ก๋๋ค. ๊ทธ๋ฌ๋ try
ํจ์๊ฐ ๋๋ฒ๊น
์ ๋ ์ฝ๊ฒ ๋ง๋ค์ง ์๋ ๊ฒ์ ์ฌ์ค์
๋๋ค. try
- catch
๋๋ try
๋ณด๋ค ์ฝ๊ฐ ๋ ๋ง์ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด์ผ ํ ์๋ ์์ต๋๋ค. else
.
@owais
defer ๋ฌธ์ ์ถ๊ฐํ๋ฉด ๋์์ด ๋ ์ ์์ง๋ง ํจ์๊ฐ ๋ชจ๋ try() ํธ์ถ์ ๋ํด ํธ๋ฆฌ๊ฑฐ๋๋ฏ๋ก ์ฌ๋ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ ์ต์์ ๊ฒฝํ์ด ์๋๋๋ค.
๋ฐํํ๊ธฐ ์ ์ ๋ค๋ฅธ ์ ํ์ ์ค๋ฅ๋ฅผ ์ ์ ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ(๋๋ ์ฒ๋ฆฌํ์ง ์์)ํ๋ ์ง์ฐ๋ ํจ์์ ์ ํ ์ค์์น๋ฅผ ํญ์ ํฌํจํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง์ ๋ ผ์, ํนํ ๋ฐ๋ ํ์ ์๋ต์ ๊ณ ๋ คํ ๋, ์ ๋ ํ์ด ํ ์ด๋ธ์ ์๋ ์ ์์ ๊ณ์ ์งํํ ๊ณํ์ด๋ผ๋ ๊ฐํ ์ธ์์ ๋ฐ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์๊ฒฌ ๋ฐ ์์ฒญ:
์๋ ๊ทธ๋๋ก์ ์ ์ IMO๋ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ฝ๋ ํ์ง์ ์ค์ํ์ง ์์ ๊ฐ์๋ฅผ ์ด๋ํ ๊ฒ์
๋๋ค. ์ ๊ธฐ๋์๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๊ฐ์ฅ ์ ํญ์ด ์ ์ ๊ธธ์ ํํ๊ณ ์์ธ ์ฒ๋ฆฌ ๊ธฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ง์ ์์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ try()
๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ค๋ ๋์ ๋ํ ์ฐ์ธํ ๊ฐ์ ์ ๊ฐ์ํ ๋, ๋๋ ์ง๊ธ์ ์ด๋ค ์
์ฅํจ๋ ์ง๋ ์ธ์์ ํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ํ์์ ์ํด ์ด์๋ฅผ ๋ฑ๋กํ๋ ๊ฒ๋ฟ์
๋๋ค.
ํ์ด ํ์ฌ ์์ฑ๋ ์ ์์ ๊ณ์ ์งํํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ์ฝ๋๋ฅผ ์ํ์ง ์๊ณ ๊ณ ์ฉํ ํ๋ก๊ทธ๋๋จธ๋ฅผ ํ์ฉํ์ง ์๋ ์ฌ๋๋ค์ ์ํด try()
๋ฅผ ๋นํ์ฑํํ๋ ์ปดํ์ผ๋ฌ ์ค์์น๋ฅผ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ทธ๊ฒ์ ์ฌ์ฉ์์? _(๋ฌผ๋ก CI๋ฅผ ํตํด.)_ ์ด๋ฌํ ๊ณ ๋ ค์ ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
try()๋ฅผ ๋นํ์ฑํํ๋ ์ปดํ์ผ๋ฌ ์ค์์น๋ฅผ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น?
์ด๊ฒ์ ์ปดํ์ผ๋ฌ IMO๊ฐ ์๋ Linting ๋๊ตฌ์ ์์ด์ผ ํ์ง๋ง ๋์ํฉ๋๋ค.
์ด๊ฒ์ ์ปดํ์ผ๋ฌ IMO๊ฐ ์๋ Linting ๋๊ตฌ์ ์์ด์ผ ํ์ง๋ง ๋์ํฉ๋๋ค.
์ต์ ๊ณผ ๊ฐ์ ์ปดํ์ผ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ linting ๋๊ตฌ๊ฐ ์๋ ์ปดํ์ผ๋ฌ ์ต์ ์ ๋ช ์์ ์ผ๋ก ์์ฒญํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ก์ปฌ ๊ฐ๋ฐ ์ค์ ๋ณดํธ๋ผ๊ธฐ๋ฅผ _"์์ด๋ฒ๋ฆฌ๊ธฐ"_ ๋๋ฌด ์ฝ์ต๋๋ค.
@mikeschinkel ๊ทธ๋ฐ ์ํฉ์์ ์ปดํ์ผ๋ฌ ์ต์ ์ ์ผ๋ ๊ฒ์ ์๋ ๊ฒ๋ ์ฝ์ง ์์๊น์?
์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํด์๋ ์ ๋ฉ๋๋ค. ์ด๊ฒ์ ์์์ฌ/๋ณดํธ๋ผ๊ธฐ์๊ฒ ํจ์ฌ ๋ ์ ํฉํฉ๋๋ค.
๊ทธ๋ฐ ์ํฉ์์ ์ปดํ์ผ๋ฌ ์ต์ ์ ์ผ๋ ๊ฒ์ ์๋ ๊ฒ๋งํผ์ด๋ ์ฝ์ง ์์๊น์?
์ปดํ์ผ ์ ์ ๋ฆฐํธ๋ฅผ ๊ฐ์ ๋ก ์คํํ ๋ฐฉ๋ฒ์ด ์๋ GoLand์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํด์๋ ์ ๋ฉ๋๋ค.
-nolocalimports
๋ ์ฌ์์ ๋ณ๊ฒฝํ๊ณ -s
๋ ๊ฒฝ๊ณ ํฉ๋๋ค.
์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํด์๋ ์ ๋ฉ๋๋ค.
-nolocalimports
๋ ์ฌ์์ ๋ณ๊ฒฝํ๊ณ-s
๋ ๊ฒฝ๊ณ ํฉ๋๋ค.
์๋์, ์ฌ์์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ธ์ด์ ๋ฌธ๋ฒ์ด ๊ณ์ ๋์ผํ๊ฒ ์ ์ง๋ ๋ฟ๋ง ์๋๋ผ ์ฌ์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช ์๋์ด ์์ต๋๋ค.
ImportPath์ ํด์์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ๋ ํจํค์ง์ ์ ์ฒด ํ์ผ ์ด๋ฆ์ ํ์ ๋ฌธ์์ด์ด๋ฉฐ ์ค์น๋ ํจํค์ง์ ์ ์ฅ์์ ๊ด๋ จ๋ ์ ์์ต๋๋ค.
์ปดํ์ผ ์ ์ ๋ฆฐํธ๋ฅผ ๊ฐ์ ๋ก ์คํํ ๋ฐฉ๋ฒ์ด ์๋ GoLand์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint
@deanveloper
https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint
ํ์คํ ๊ทธ๊ฒ์ ์กด์ฌํ์ง๋ง ๋น์ ์ ์ฌ๊ณผ ๋ ์กฐ์ง์ ๋น๊ตํ๊ณ ์์ต๋๋ค. ๋น์ ์ด ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ํ์ผ์ด ๋ณ๊ฒฝ๋ ๋ ์คํ๋๋ ํ์ผ ๊ฐ์์์ด๋ฉฐ GoLand๊ฐ ํ์ผ์ ์๋ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ ํธ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๋ ธ์ด์ฆ๋ฅผ ์์ฑํ๋ ์ง์์ ์ผ๋ก ์คํ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
lint๋ ํญ์ ์ปดํ์ผ๋ฌ ์คํ์ ์ํ ์ ์ ์กฐ๊ฑด์ผ๋ก ๋ก ๊ตฌ์ฑ๋์ง ์๊ณ ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค(AFAIK).
์๋์, ์ฌ์์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ธ์ด์ ๋ฌธ๋ฒ์ด ๊ณ์ ๋์ผํ๊ฒ ์ ์ง๋ ๋ฟ๋ง ์๋๋ผ ์ฌ์์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช ์๋์ด ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ด์ ์ ๋ง์ถ๋ ๋์ ์ฌ๊ธฐ์์ ์๋ฏธ๋ก ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ๋๊ฐ์ด ํ ๊ฒ์ด๋ค.
try()
๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ปดํ์ผํ ์ ์๋๋ก ํ๋ ์ปดํ์ผ๋ฌ ์ต์
์ ์ถ๊ฐํ๋๋ก ์์ฒญํฉ๋๋ค. ์ด๊ฒ์ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํ๋ผ๋ ์์ฒญ์ด ์๋๋ผ ์ด ํน๋ณํ ๊ฒฝ์ฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ค์งํ๋ผ๋ ์์ฒญ์ผ ๋ฟ์
๋๋ค.
๋์์ด ๋๋ค๋ฉด ์ธ์ด ์ฌ์์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
try()
์ ํด์์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ ์ค๋ฅ์ผ ๋ ๋ฐํ์ ํธ๋ฆฌ๊ฑฐํ๋ ํด์์ด์ง๋ง ํ์ฉ๋์ง ์๋๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ ์ ํ์ด๋ ์์์ฌ ํ์ธ์ ์์ฒญํ ์๊ฐ์ try()
ํ๋กํ ํ์
์ด 1.14(?) ํ์ ํฌํจ๋ ํ์
๋๋ค. ๊ทธ ์์ ์์ ๋น์ ์ ๊ทธ๊ฒ์ ๋ํ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ๊ฒ์
๋๋ค(์, ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค). ์ฐ๋ฆฌ๋ ํ์ฌ ๋์์ธ ๋ฌธ์์ ๋ํ ์ฌ์ค์ ์
๋ ฅ์ผ๋ก ์ฌ๊ธฐ์์ ์ฝ๋ฉํธ๋ฅผ ์ ํํ๋ผ๋ ์์ฒญ์ ๋ฐ์์ต๋๋ค.
์๋
ํ์ธ์. ๊ฐ๋ฐ ์ค์ ๋๋ฒ๊ทธ ๋ฌธ ๋ฑ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ ์ฒด ๋ฌธ์ ์ ์ถ๊ฐํฉ๋๋ค.
try()
ํจ์์๋ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ ์์ด๋์ด๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ง๋ง emit
์ ์ try()
์ ๋ํ ๋ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ๋ฐํ ๋ ์ค๋ฅ๋ฅผ ์ธ์ํ๊ธฐ ์ํด ์ด ์๊ฐ์ fmt
๋ฅผ ํธ์ถํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ด๊ฒ์์ ๊ฐ ์ ์์ต๋๋ค :
func writeStuff(filename string) (io.ReadCloser, error) {
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
๋๋ฒ๊ทธ ๋ฌธ์ด๋ ์ผ๋ฐ ์ฒ๋ฆฌ ๋๋ ๋ฐํํ๊ธฐ ์ ์ ์ค๋ฅ์ ๋ํด ์ด์ ๊ฐ์ด ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
func writeStuff(filename string) (io.ReadCloser, error) {
emit err {
fmt.Printf("something happened [%v]\n", err.Error())
return nil, err
}
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
๊ทธ๋์ ์ฌ๊ธฐ์ ์ด๊ธฐ try()
๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฆ๊ฐ์ ์ธ ๋ฐํ์ ์ํ ํ ๋ฌธ์ฅ ๋๋ ํ๋์ ๋ผ์ด๋๊ฐ ๋ ์ ์๋ ์ ํค์๋ emit
์ ๋ํ ์ ์์ ์ ์ถํ์ต๋๋ค.
emit return nil, err
๋ฐฉ์ถ์ ๋ณธ์ง์ ์ผ๋ก try()
๊ฐ nil๊ณผ ๊ฐ์ง ์์ ์ค๋ฅ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒฝ์ฐ ์ํ๋ ๋
ผ๋ฆฌ๋ฅผ ๋ฃ์ ์ ์๋ ์ ์
๋๋ค. emit
ํค์๋์ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํค์๋๋ฅผ ์ฌ์ฉํ ์ฒซ ๋ฒ์งธ ์์ ์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ณ์ ์ด๋ฆ์ ํค์๋ ๋ฐ๋ก ๋ค์ ์ถ๊ฐํ๋ฉด ์ค๋ฅ์ ๋ฐ๋ก ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ด ์ ์ ์ try()
ํจ์์ ๋ํด ์ฝ๊ฐ์ ์ฅํฉํจ์ ์ ๊ณตํ์ง๋ง ์ค๋ฅ๋ก ์ธํด ๋ฐ์ํ๋ ์ํฉ์ ๋ํด ์ ์ด๋ ์กฐ๊ธ ๋ ๋ช
ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ฅ๋ฅผ ๋ชจ๋ ํ ์ค๋ก ๋ฌถ์ง ์๊ณ ๋ ์ฅ์ํ ์ ์๊ณ ํจ์๋ฅผ ์ฝ์ ๋ ์ฆ์ ์ค๋ฅ๊ฐ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ด๊ฒ์ @mikeschinkel ์ ๋ํ ์๋ต์ ๋๋ค. ํ ๋ก ์ ๋๋ฌด ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๊ธฐ ์ํด ์ธ๋ถ ์ฌํญ ๋ธ๋ก์ ์๋ต์ ๋ฃ์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ , @networkimprov ๋ ์ด ์ ์์ด ๊ตฌํ๋ ๋๊น์ง(๋ง์ฝ ๊ตฌํ๋๋ค๋ฉด) ์ด ๋ ผ์๊ฐ ํ ์ด๋ธ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค.
์๋๋ฅผ ๋นํ์ฑํํ๋ ํ๋๊ทธ์ ๋ํ ์ธ๋ถ์ ๋ณด
@mikeschinkel
lint๋ ํญ์ ์ปดํ์ผ๋ฌ ์คํ์ ์ํ ์ ์ ์กฐ๊ฑด์ผ๋ก ๋ก ๊ตฌ์ฑ๋์ง ์๊ณ ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค(AFAIK).
์ด๊ฒ์ ํ
์คํธํ๊ธฐ ์ํด GoLand๋ฅผ ๋ค์ ์ค์นํ์ต๋๋ค. ์ด๊ฒ์ ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ์ผํ ์ฐจ์ด์ ์ ๋ณดํธ๋ผ๊ธฐ๊ฐ ๋ง์์ ๋ค์ง ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด ์ปดํ์ผ์ ์คํจํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. golint
๋ฅผ ์คํํ๊ณ ์ถ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ 0์ด ์๋ ์ข
๋ฃ ์ฝ๋๋ก ์คํจํ๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๋ก ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค.
(ํธ์ง: ๋งจ ์๋์ ์๋ ค์ฃผ๋ ค๊ณ ํ๋ ์ค๋ฅ๋ฅผ ์์ ํ์ต๋๋ค. ์ค๋ฅ๊ฐ ์๋ ๋์์๋ ์ ์คํ๋๊ณ ์์์ง๋ง "Run Kind"๋ฅผ ๋๋ ํ ๋ฆฌ๋ก ๋ณ๊ฒฝํ๋ฉด ์ค๋ฅ๊ฐ ์ ๊ฑฐ๋๊ณ ์ ๋๋ก ์๋ํ์ต๋๋ค)
๋ํ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ์๋์ด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ด์ - ๋ชจ๋ Go ์ฝ๋๋ ์์ค์์ ์ปดํ์ผ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฆ, ์ปดํ์ผ๋ฌ๋ฅผ ํตํด try
๋ฅผ ์ผ๊ณ ์ถ๋ค๋ฉด ์ฌ์ฉ ์ค์ธ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด try
๋ ๊บผ์ผ ํฉ๋๋ค. ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ด์ ์ ๋ง์ถ๋ ๋์ ์ฌ๊ธฐ์์ ์๋ฏธ๋ก ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์๋ ๋๋ ์๋. ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํด์๋ ์ ๋ฉ๋๋ค. ์ฌ์์ ๋งค์ฐ ์ ๋ฐฐ์น๋์ด ์์ผ๋ฉฐ "์ด๋"ํ๋ ค๋ฉด ์ฌ์์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์ธ๊ธํ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด์ ๋์์ ๋ณ๊ฒฝํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ ์ธ์ด๊ฐ ์ฌ์ ํ ์ฌ์์ ๋ฐ๋ฅด๋์ง ํ์ธํฉ๋๋ค. ์ด๊ฒ์ Go์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. Go ์ฌ์์ ๋ฐ๋ฅด๋ ํ ์ฝ๋๋ ๋ชจ๋ Go ์ปดํ์ผ๋ฌ์์ ์ปดํ์ผ๋์ด์ผ ํฉ๋๋ค.
try()๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ปดํ์ผํ ์ ์๋๋ก ํ๋ ์ปดํ์ผ๋ฌ ์ต์ ์ ์ถ๊ฐํ๋๋ก ์์ฒญํฉ๋๋ค. ์ด๊ฒ์ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํ๋ผ๋ ์์ฒญ์ด ์๋๋ผ ์ด ํน๋ณํ ๊ฒฝ์ฐ์ ์ปดํ์ผ๋ฌ๋ฅผ ์ค์งํ๋ผ๋ ์์ฒญ์ผ ๋ฟ์ ๋๋ค.
์ฌ์ ๋ณ๊ฒฝ ์์ฒญ์
๋๋ค. ์ด ์ ์ ์์ฒด๊ฐ ์ฌ์ ๋ณ๊ฒฝ ์์ฒญ์
๋๋ค. ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ผ๋ก ํฌํจ๋์ด ์์ต๋๋ค. . ๋ฐ๋ผ์ try
๋ด์ฅ์ ์ ๊ฑฐํ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์์ฒญํ๋ ๊ฒ์ ์ปดํ์ผ๋๋ ์ธ์ด์ ์ฌ์์ ๋ณ๊ฒฝํ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ๋ฉ๋๋ค.
์ฆ, ImportPath
๋ ์ฌ์์์ ํ์คํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ํ ์ ์์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์์ด๋๋ค๋ฉด ์ธ์ด ์ฌ์์ ์ ๋ฐ์ดํธํ์ฌ [...]
์ด๊ฒ์ด ์ฌ์ค์ด์ง๋ง try
์ ๊ตฌํ์ด ๊ตฌํ์ ์ข
์๋๋ ๊ฒ์ ์ํ์ง ์์ ๊ฒ์
๋๋ค. ๋ชจ๋ Go ์ปดํ์ผ๋ฌ์์ ๋์ผํด์ผ ํ๋ ์ธ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค์ํ ๋ถ๋ถ์ด ๋๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
@deanveloper
_"์ด๋ ์ชฝ์ด๋ @networkimprov ๋ ์ด ์ ์์ด ๊ตฌํ๋ ๋๊น์ง ์ด ๋ ผ์๋ฅผ ํ ์ด๋ธ์ ์ฌ๋ ค์ผ ํ๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค(๊ทธ๋ ๋ค๋ฉด)."_
๊ทธ๋ ๋ค๋ฉด ์ ๊ทธ ์ ์์ ๋ฌด์ํ๊ณ ๋์ค์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ด ์ค๋ ๋์ ๊ฒ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๊น? ๋น์ ์ ์ฌ๊ธฐ์์ ๋น์ ์ ์์ ์ ์ฃผ์ฅํ๋ฉด์ ๋์์ ๋ด๊ฐ ๋น์ ์ ์์ ์ ๋์ ํด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค. ๋ง์๋๋ก ์ค์ฒํ๋ผ...
๋น์ ์๊ฒ ์ ํ๊ถ์ด ์ฃผ์ด์ง๋ฉด, ๋๋ ๋ํ ์ธ๋ถ ์ฌํญ ๋ธ๋ก์์ ์๋ตํ๋๋ก ์ ํํ ๊ฒ์
๋๋ค.์ฌ๊ธฐ:
_"๊ทธ๊ฒ์ golint๋ฅผ ์คํํ๊ณ ์ถ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ 0์ด ์๋ ์ข ๋ฃ ์ฝ๋๋ก ์คํจํ๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๋ก ์ฝ๊ฒ ๊ณ ์น ์ ์์ต๋๋ค."_
์, ์ถฉ๋ถํ ์ฝ๋ฉ์ผ๋ก _any_ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ฒฝํ์ ํตํด ์๋ฃจ์ ์ด ๋ณต์กํ ์๋ก ์ฌ์ฉํ๋ ค๋ ์ฌ๋์ด ์ค์ด๋ค์๋ก ๊ฒฐ๊ตญ ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ์ฌ๊ธฐ์์ ์ง์ ๊ตฌํํ๋ ์๋ฃจ์ ์ด ์๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋ช ์์ ์ผ๋ก ์์ฒญํ์ต๋๋ค.
_"์ฌ์ฉ ์ค์ธ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ ์๋๋ฅผ ๋๊ฒ ๋ฉ๋๋ค."_
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ด๊ฐ ์์ฒญํ _๋ช ์์ ์ผ๋ก_ ์ด์ ์ ๋๋ค. ์ด ๋ฒ๊ฑฐ๋ก์ด _"๊ธฐ๋ฅ"_์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ฐฐํฌํ๋ ์คํ ํ์ผ์ ๋ค์ด๊ฐ์ง ์๋๋ก ํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ค.
_"์ฌ์ ๋ณ๊ฒฝ ์์ฒญ์ ๋๋ค. ์ด ์ ์ ์์ฒด๊ฐ ์ฌ์ ๋ณ๊ฒฝ ์์ฒญ์ ๋๋ค._"
์ฌ์ ๋ณ๊ฒฝ์ ์ ๋ ์๋๋๋ค. build
๋ช
๋ น์ด์ _behavior_ ๋ณ๊ฒฝ์ ์ํ ์ค์์น ์์ฒญ์ด์ง, ์ธ์ด ์ฌ์ ๋ณ๊ฒฝ์ด ์๋๋๋ค.
๋๊ตฐ๊ฐ๊ฐ go
๋ช
๋ น์ ํฐ๋ฏธ๋ ์ถ๋ ฅ์ ๋ง๋ค๋ฆฐ์ด๋ก ํ์ํ๋ ์ค์์น๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ์ด๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝ์ด ์๋๋๋ค.
์ ์ฌํ๊ฒ go build
๊ฐ ์ด ์ค์์น๋ฅผ ๋ณธ๋ค๋ฉด ๊ทธ๊ฒ์ ๋จ์ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ try()
๋ฅผ ๋ง๋ฌ์ ๋ ๋ฉ์ถฅ๋๋ค. ์ธ์ด ์ฌ์ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์์ต๋๋ค.
_"๋ชจ๋ Go ์ปดํ์ผ๋ฌ์์ ๋์ผํด์ผ ํ๋ ์ธ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค์ํ ๋ถ๋ถ์ผ๋ก ๋ง๋ค์ด์ก์ต๋๋ค."_
๊ทธ๊ฒ์ ์ธ์ด์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ด ๋ ๊ฒ์ด๋ฉฐ ์ ํ ์ฌํญ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ ์ฌ๋๋ค์ด ๊ทธ๋ ๊ฒ ํ ์ ์๋๋ก ํ์ฉํ ๊ฒ์ ๋๋ค.
์ค์์น๊ฐ ์์ผ๋ฉด ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ธ์ํ๊ณ ์์ฉํ๊ณ ์ค์ ๋ก ์ฌ์ฉํด์ผ ํ๋์ง ๋ฌป์ง ์์ ๊ฒ์ ๋๋ค.
_์ค์์น์ ํจ๊ป_ โ ๊ทธ๋ฆฌ๊ณ ์ค์์น๋ฅผ ์ธ๊ธํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ๊ธฐ์ฌ โ ๋ง์ ์ฌ๋๋ค์ด ์ด๊ฒ์ด ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ์์์ ์ดํดํ๊ณ Go ํ์ด ์ผ๋ง๋ ๋ง์ ๊ณต๊ฐ ์ฝ๋๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๋์ง ํ์ธํ์ฌ ์ข์ ํฌํจ ์ฌ๋ถ๋ฅผ ์ฐ๊ตฌํ ์ ์๊ฒ ํ ๊ฒ์ ๋๋ค. vs. ๊ณต๊ฐ ์ฝ๋๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ. ๊ทธ๊ฒ์ Go 3์ ๋์์ธ์ ์๋ฆด ์ ์์ต๋๋ค.
_"์๋์, ์๋๋๋ค. ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ์ธ์ด ์ฌ์์ ๋ณ๊ฒฝํด์๋ ์ ๋ฉ๋๋ค."_
์๋งจํฑ์ ํ์ง ์๋๋ค๊ณ ํด์ ์๋งจํฑ์ ํ์ง ์๋ ๊ฒ์ ์๋๋๋ค.
๊ด์ฐฎ์. ๊ทธ๋ฐ ๋ค์ $#$5 try()
#$ ํ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ์์ํ์ฌ ์ปดํ์ผ ์ค์ ๋ฌธ์ ๊ฐ ์๋ ๊ธฐ๋ฅ์ ํ์ฉํ์ง ์๋ ๋ฐ ์ฌ์ฉ๋๋ _(something like)_ build-guard
๋ผ๋ ์๋ก์ด ์ต์์ ๋ช
๋ น์ ๋์ ์์ฒญํฉ๋๋ค.
๋ฌผ๋ก ๊ฐ์ฅ ์ข์ ๊ฒฐ๊ณผ๋ try()
๊ธฐ๋ฅ์ด ๋ฏธ๋์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ฌ๊ณ ํ ๊ณํ๊ณผ ํจ๊ป ํ๋ก ๋ง๋ค์ด์ง๋ ๊ฒ์
๋๋ค. ๋๋ค์๊ฐ ๋์ํ๋ ๋ฐฉ์์
๋๋ค. ๊ทธ๋ฌ๋ ๋ฐฐ๊ฐ ์ด๋ฏธ try()
๋ก ํญํดํ ๊ฒ์ด ๋๋ ต๊ธฐ ๋๋ฌธ์ ๊ทธ ๋จ์ ์ ์ต์ํํ๊ธฐ๋ฅผ ๋ฐ๋ผ๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด์ @networkimprov ์ ์ง์ ์ผ๋ก ๋์ํ๋ค๋ฉด ๊ทธ๋ค์ด ์ ์ํ ๋๋ก ๋์ค์ ๋ต์ฅ์ ๋ณด๋ฅํ์ญ์์ค.
๋ฐฉํดํด์ ์ฃ์กํ์ง๋ง ๋ณด๊ณ ํ ์ฌ์ค์ด ์์ต๋๋ค :-)
๋ฐ๋ํ์ ์ด๋ฏธ ์ฐ๊ธฐ๋ฅผ ๋ฒค์น๋งํนํ ๊ฒ ๊ฐ์๋ฐ ์์น๋ ๋ณธ์ ์ด ์๋ค์...
$ go test -bench=.
goos: linux
goarch: amd64
BenchmarkAlways2-2 20000000 72.3 ns/op
BenchmarkAlways4-2 20000000 68.1 ns/op
BenchmarkAlways6-2 20000000 68.0 ns/op
BenchmarkNever2-2 100000000 16.5 ns/op
BenchmarkNever4-2 100000000 13.1 ns/op
BenchmarkNever6-2 100000000 13.5 ns/op
์์ฒ
package deferbench
import (
"fmt"
"errors"
"testing"
)
func Always(iM, iN int) (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("d: %v", err)
}
}()
if iN % iM == 0 {
return errors.New("e")
}
return nil
}
func Never(iM, iN int) (err error) {
if iN % iM == 0 {
return fmt.Errorf("r: %v", errors.New("e"))
}
return nil
}
func BenchmarkAlways2(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e2, a) }}
func BenchmarkAlways4(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e4, a) }}
func BenchmarkAlways6(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e6, a) }}
func BenchmarkNever2(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e2, a) }}
func BenchmarkNever4(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e4, a) }}
func BenchmarkNever6(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e6, a) }}
@networkimprov
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md#efficiency -of-defer์์ (๋ณผ๋์ฒด๋ก ๊ฐ์กฐ)
๋ ๋ฆฝ์ ์ผ๋ก Go ๋ฐํ์ ๋ฐ ์ปดํ์ผ๋ฌ ํ์ ๋์ฒด ๊ตฌํ ์ต์ ์ ๋ํด ๋ ผ์ํด ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ๊ธฐ์กด "์๋" ์ฝ๋๋งํผ ํจ์จ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ ์ฐ๊ธฐ ์ฌ์ฉ์ ๋ง๋ค ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. Go 1.14์์ ์ด ๋ ๋น ๋ฅธ ์ง์ฐ ๊ตฌํ์ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค (์ด ๋ฐฉํฅ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ธ * CL 171758 * ์ฐธ์กฐ).
์ฆ, defer๋ ์ด์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์ํ go1.13์ 30% ์ฑ๋ฅ ํฅ์์ด๋ฉฐ go 1.14์ non-defer ๋ชจ๋๋งํผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด์ด์ผ ํฉ๋๋ค.
๋๊ตฐ๊ฐ 1.13 ๋ฐ 1.14 CL์ ๋ํ ๋ฒํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น?
์ต์ ํ๊ฐ ํญ์ ์ ๊ณผ์ ์ ์ด์์ ์ด์๋จ๋ ๊ฒ์ ์๋๋๋ค... ์ด, ์ํ๊ณ.
1.13 ์ฐ๊ธฐ๋ ์ฝ 30% ๋ ๋น ๋ฆ ๋๋ค.
name old time/op new time/op delta
Defer-4 52.2ns ยฑ 5% 36.2ns ยฑ 3% -30.70% (p=0.000 n=10+10)
์ด๊ฒ์ ์์ @networkimprov ํ ์คํธ์์ ์ป์ ๊ฒ์ ๋๋ค(1.12.5์์ ํ๊น์ง).
name old time/op new time/op delta
Always2-4 59.8ns ยฑ 1% 47.5ns ยฑ 1% -20.57% (p=0.008 n=5+5)
Always4-4 57.9ns ยฑ 2% 43.5ns ยฑ 1% -24.96% (p=0.008 n=5+5)
Always6-4 57.6ns ยฑ 2% 44.1ns ยฑ 1% -23.43% (p=0.008 n=5+5)
Never2-4 13.7ns ยฑ 8% 3.8ns ยฑ 4% -72.27% (p=0.008 n=5+5)
Never4-4 10.5ns ยฑ 6% 1.3ns ยฑ 2% -87.76% (p=0.008 n=5+5)
Never6-4 10.8ns ยฑ 6% 1.2ns ยฑ 1% -88.46% (p=0.008 n=5+5)
(์ Never ๊ฒ๋ค์ ํจ์ฌ ๋ ๋น ๋ฅธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ธ๋ผ์ธํ ์ ์์ต๋๊น?)
1.14์ ๋ํ ์ฐ๊ธฐ์ ๋ํ ์ต์ ํ๋ ์์ง ๊ตฌํ๋์ง ์์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ผ๋ฐ ํจ์ ํธ์ถ์ ์ฑ๋ฅ์ ๊ฐ๊น์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๊ทธ ์ ์์ ๋ฌด์ํ๊ณ ๋์ค์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ด ์ค๋ ๋์ ๊ฒ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๊น?
์ธ๋ถ ์ ๋ณด ๋ธ๋ก์ @networkimprov ๋ ์ ์๊ฒฌ์ ์ฝ์ ํ ๋์ค์ ํธ์ง๋์์ต๋๋ค. ๊ทธ ์ฌ๋์ ๋ง์ ์ดํดํ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๊ณ ๋ฌด์ํด์ ์ฃ์กํฉ๋๋ค. ์ด ๋ฐ์ธ์ ๋์ผ๋ก ํ ๋ก ์ ๋ง์น๊ฒ ์ต๋๋ค. ์ ๋๊ธ์ ๋ฌ์๋๊ณ ๋ฌผ์ด๋ณด์ จ๊ธฐ์ ์ ์ค๋ช ์ ๋๋ฆฌ๊ณ ์ถ์์ต๋๋ค.
์ฐ๊ธฐํ ์ต์ ํ์ ๊ด๋ จํ์ฌ ์ ๋ ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ค์ ์ด ์ ์์ ์ฝ๊ฐ ๋์ defer HandleErrorf(...)
๋ฅผ ๋ ๋ฌด๊ฒ๊ฒ ๋ง๋ญ๋๋ค. ํ์ง๋ง ์ด ํธ๋ฆญ์ด ์๋ํ๊ธฐ ์ํด ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋จ์ฉํ๋ ์์ด๋์ด๋ ์ฌ์ ํ ๋ง์์ ๋ค์ง ์์ต๋๋ค. 1.14์์๋ ์ผ๋ง๋ ๋นจ๋ผ์ง ๊ฒ์ผ๋ก ์์๋ฉ๋๊น? ๋น์ทํ ์๋๋ก ์คํํด์ผ ํฉ๋๊น?
@griesemer ์กฐ๊ธ ๋ ํ์ฅํ ๊ฐ์น๊ฐ ์๋ ์์ญ ์ค ํ๋๋ try
๊ฐ ํฌํจ๋ ์ธ๊ณ์์ ์ ํ์ด ์๋ํ๋ ๋ฐฉ์์
๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค.
vet
๋๋ staticcheck
๋๋ ์ด์ ์ ์ฌํ ์ ํ์ ์ํด ํฌ์ฐฉ๋๋์ง, vs. (c) ๋ค์๊ณผ ๊ฐ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋์น์ฑ์ง ๋ชปํ ์๋ ์๊ณ ํ
์คํธ๋ฅผ ํตํด ์ก์์ผ ํ ์๋ ์์ต๋๋ค.gopls
(๋๋ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ)๊ฐ ์ผ๋ฐ์ ์ธ ์ฅ์ ์คํ์ผ ์ ํ์ ์๋ํํ๋ ์ญํ ์ ํ ์ ์๊ฑฐ๋ ํด์ผ ํ๋์ง ์ฌ๋ถ.์ด๊ฒ์ด ์์ ํ์ง๋ ์์ง๋ง ๋ํ์ ์ธ ๋จ๊ณ ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
0. ์ค๋ฅ ์ฅ์ ์์ (์: ์ฅ์ ์์ด try
์ฌ์ฉ).
1. ๊ท ์ผํ ์ค๋ฅ ์ฅ์ (์: ๊ท ์ผ ์ฅ์์ ์ํด try
+ defer
์ฌ์ฉ).
2. N-1๊ฐ์ ์ข
๋ฃ์ ์ ๊ท ์ผํ ์ค๋ฅ ์ฅ์ ์ ๊ฐ์ง๋ง 1๊ฐ์ ์ถ๊ตฌ์ ์ ๋ค๋ฅธ ์ฅ์์ ๊ฐ์ต๋๋ค(์: ํ ์์น์ ์๊ตฌ์ ์ธ ์ธ๋ถ ์ค๋ฅ ์ฅ์ ๋๋ ์์ ๋๋ฒ๊ทธ ๋ก๊ทธ ๋ฑ).
3. ๋ชจ๋ ์ถ๊ตฌ ์ง์ ์๋ ๊ฐ๊ฐ ๊ณ ์ ํ ์ค๋ฅ ์ฅ์ ๋๋ ๊ณ ์ ํ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค.
์ฃผ์ด์ง ๋ชจ๋ ๊ธฐ๋ฅ์ ํด๋น ๋จ๊ณ๋ฅผ ํตํด ์๊ฒฉํ ์งํ์ ๊ฐ์ง์ง ์์ ๊ฒ์ด๋ฏ๋ก "๋จ๊ณ"๊ฐ ์๋ชป๋ ๋จ์ด์ผ ์ ์์ง๋ง ์ผ๋ถ ๊ธฐ๋ฅ์ ํ ๋ฐ์ฝ๋ ์ด์ ์คํ์ผ์์ ๋ค๋ฅธ ๋ฐ์ฝ๋ ์ด์ ์คํ์ผ๋ก ์ ํ๋๋ฉฐ ์ด๋ฌํ ์ ํ์ด ๋ฌด์์ธ์ง์ ๋ํด ๋ณด๋ค ๋ช ์์ ์ธ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ์ธ์ ๋๋ ์ผ์ด๋ ๋์ ๊ฐ์ต๋๋ค.
0๋จ๊ณ์ 1๋จ๊ณ๋ ํ์ฌ ์ ์์ ์ค์ํธ ์คํฟ์ผ๋ก ๋ณด์ด๋ฉฐ ์๋นํ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ด๊ธฐ๋ ํฉ๋๋ค. ๋จ๊ณ 0->1 ์ ํ์ ๊ฐ๋จํด ๋ณด์
๋๋ค. 0๋จ๊ณ์์ ์ฅ์ ์์ด try
๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค๋ฉด defer fmt.HandleErrorf(&err, "foo failed with %s", arg1)
์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ ์๊ฐ์ ์ฒ์ ์์ฑ๋ ์ ์์ ์๋์ ๋ช
๋ช
๋ ๋ฐํ ๋งค๊ฐ๋ณ์๋ฅผ ๋์
ํด์ผ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์์๊ฐ ์ต์ข
์ค๋ฅ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ๋ํ ๋ณ์นญ์ธ ๋ฏธ๋ฆฌ ์ ์๋ ๊ธฐ๋ณธ ์ ๊ณต ๋ณ์ ๋ผ์ธ์ ๋ฐ๋ผ ์ ์ ์ค ํ๋๋ฅผ ์ฑํํ๋ฉด ์ฌ๊ธฐ์ ์ค๋ฅ์ ๋น์ฉ๊ณผ ์ํ์ด ์์ ์ ์์ต๋๊น?
๋ฐ๋ฉด์ 1๋จ๊ณ๊ฐ defer
๊ฐ ์๋ ๊ท ์ผํ ์ค๋ฅ ์ฅ์์ธ ๊ฒฝ์ฐ ๋จ๊ณ 1->2 ์ ํ์ด ์ด์ํด ๋ณด์
๋๋ค(๋๋ ์ผ๋ถ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋งํ๋ฏ์ด "์ฑ๊ฐ์ "). ํ๋์ ์ถ๊ตฌ ์ง์ ์ ํน์ ์ฅ์ ๋นํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ defer
๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค(์ด์ค ์ฅ์์ ํผํ๊ธฐ ์ํด). ๊ทธ๋ฐ ๋ค์ try
์คํ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐํ ์ง์ ์ ๋ฐฉ๋ฌธํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. if
๋ฌธ์ ์ฌ์ฉํ๋ฉฐ ์ค๋ฅ ์ค N-1๊ฐ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฅ์๋๊ณ 1๊ฐ๋ ๋ค๋ฅด๊ฒ ์ฅ์๋ฉ๋๋ค.
1->3๋จ๊ณ ์ ํ๋ ์๋์ผ๋ก ์ํํ๋ฉด ์ด์ํด ๋ณด์ ๋๋ค.
์๋ ๋์๊ฐ๋ง ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ๋ฐ์ํ ์ ์๋ ๋ช ๊ฐ์ง ์ค์์๋ ์ค์๋ก ๋ณ์๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ๋ช
๋ช
๋ ๋ฐํ ๋งค๊ฐ๋ณ์๊ฐ ์ด๋ป๊ฒ ์ํฅ์ ๋ฐ๋์ง ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ ๋ฅผ ๋ค์ด ์ ์์ ์๋ํ์ญ์์ค. CopyFile
ํจ์์๋ ์ด ์น์
์ ํฌํจํ์ฌ 4๊ฐ์ try
์ฉ๋๊ฐ ์์ต๋๋ค.
w := try(os.Create(dst))
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a โtryโ fails
}
}()
๋๊ตฐ๊ฐ w := try(os.Create(dst))
์ "๋ช
๋ฐฑํ" ์๋ ๋์๊ฐ๋ง์ ์ํํ๋ค๋ฉด ๊ทธ ํ ์ค์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅ๋ ์ ์์ต๋๋ค.
w, err := os.Create(dst)
if err != nil {
// do something here
return err
}
์ธ๋ป ๋ณด๊ธฐ์๋ ์ข์ ๋ณด์ด์ง๋ง ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๋ธ๋ก์ ๋ฐ๋ผ ์ด๋ฆ์ด ์ง์ ๋ ๋ฐํ ๋งค๊ฐ๋ณ์ err
๋ฅผ ์ค์๋ก ์จ๊ธฐ๊ณ ํ์ defer
์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ค๋จํ ์๋ ์์ต๋๋ค.
์๊ฐ ๋น์ฉ๊ณผ ์ค์์ ์ํ์ ๋๊ธฐ ์ํด gopls
(๋๋ ๋ค๋ฅธ ์ ํธ๋ฆฌํฐ)์๋ ํน์ try
๋๋ try
์ ๋ชจ๋ ์ฌ์ฉ์ desugarํ๋ ๋ช
๋ น ์ ํ์ด ์์ ์ ์์ต๋๋ค. 100% ์ค์๊ฐ ์์ ์ ์๋ ์ฃผ์ด์ง ํจ์์ gopls
๋ช
๋ น์ด try
์ ๊ฑฐ ๋ฐ ๊ต์ฒด์๋ง ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ผ ์ ์์ง๋ง ์๋ง๋ ๋ค๋ฅธ ๋ช
๋ น์ try
์ ๋ชจ๋ ์ฌ์ฉ์ ์ ๊ฑฐํ๋ฉด์ ์ต์ํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ณํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํจ์ ์๋จ์ defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
๋ฅผ ์ด์ try
์์น ๊ฐ๊ฐ์ ํด๋น ์ฝ๋๋ก ๋ณํํฉ๋๋ค(1->2๋จ๊ณ ๋๋ 1->3๋จ๊ณ์์ ์ ํํ ๋ ๋์์ด ๋จ). ๊ทธ๊ฒ์ ์์ ํ ๊ตฌ์ด ์์ด๋์ด๋ ์๋์ง๋ง ๊ฐ๋ฅํ๊ฑฐ๋ ๋ฐ๋์งํ ๊ฒ์ด ๋ฌด์์ธ์ง ๋๋ ํ์ฌ ์๊ฐ์ผ๋ก ์ ์์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ ๋ํด ๋ ์๊ฐํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ด๋ จ ์๊ฒฌ์ try
์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์ค์ ์๋ ๋ณํ์ด ์ ์์ ์ธ ๊ด์ฉ์ Go ์ฝ๋์ฒ๋ผ ๋ณด์ด๋ ๋น๋๊ฐ ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋์ง ์ฆ์ ๋ช
ํํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ์คํ์ ์ ๊ฑฐํ๋ ค๋ ๊ฒฝ์ฐ ์ ์์์ ์ ์ค ํ๋๋ฅผ ์ ์ฉํฉ๋๋ค.
x1, x2, x3 = try(f())
์ด๋ค ๊ฒฝ์ฐ์๋ ๋์์ ๋ณด์กดํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ๋ณํ์ด ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ์์ต๋๋ค.
t1, t2, t3, te := f() // visible temporaries
if te != nil {
return x1, x2, x3, te
}
x1, x2, x3 = t1, t2, t3
์ ํํ ํ์์ ๋๋ฌผ๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋์๊ฐ๋ง์ ์ํํ๋ ํธ์ง๊ธฐ ๋๋ IDE์ ๊ฒฐ๊ณผ๊ฐ ์ข
์ข
๋ ๊ด์ฉ์ ์ผ๋ก ๋ณด์ผ ์ ์์ง๋ง ๋ช
๋ช
๋ ๋ฐํ ๋งค๊ฐ๋ณ์๊ฐ ๋ ์ผ๋ฐ์ ์ด๋ฉฐ ์๋์, :=
๋ =
, ๋์ผํ ๊ธฐ๋ฅ์์ err
์ ๋ค๋ฅธ ์ฉ๋ ๋ฑ์ ๊ณ ๋ คํฉ๋๋ค.
์ ์์ ๋ช
๋ช
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ก ์ธํด if
์ try
์ฌ์ด์ ๊ฐ๋ฅํ ๋์ ์ฐจ์ด์ ๋ํด ์ด์ผ๊ธฐํ์ง๋ง ํด๋น ์น์
์์๋ ์ฃผ๋ก if
์ผ๋ก์ ์ ํ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค try
(๋ค์ ์น์
์์ _"์ด๊ฒ์ ๋ฏธ๋ฌํ ์ฐจ์ด์ง๋ง, ์ด์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋์์ด ์์๋๋ ๊ฒฝ์ฐ if ๋ฌธ์ ์ ์งํฉ๋๋ค."_). ๋์กฐ์ ์ผ๋ก, ๋์ผํ ๋์์ ์ ์งํ๋ฉด์ try
์์ if
$๋ก ๋ค์ ์ ํํ ๋ ์ ๊ตํ๊ฒ ํ ๊ฐ์น๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ์ค์๊ฐ ์์ ์ ์์ต๋๋ค.
์ด์จ๋ ๊ธด ์ค๋ช ์ ๋ํด ์ ๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๊ฒ์๋ ๋ค๋ฅธ ์๊ฒฌ ์ค ์ผ๋ถ์์ ํํ๋ ์ฐ๋ ค์ ๊ธฐ์ ์๋ ์คํ์ผ ๊ฐ์ ๋์ ์ ํ ๋น์ฉ์ ๋ํ ๋๋ ค์์ด ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ด๋ฌํ ์ ํ ๋น์ฉ ๋ฐ ์ ์ฌ์ ์ํ.
@thepudds ์ธ์ด ๊ธฐ๋ฅ์ด ๋ฆฌํฉํ ๋ง์ ๊ธ์ ์ ๋๋ ๋ถ์ ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ๋ ๋น์ฉ๊ณผ ์ ์ฌ์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์กฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์์ฃผ ๋ ผ์๋๋ ์ฃผ์ ๋ ์๋์ง๋ง ๋ค์ด์คํธ๋ฆผ ํจ๊ณผ๊ฐ ํด ์ ์๋ ์ฃผ์ ์ ๋๋ค.
1๋จ๊ณ๊ฐ ์ง์ฐ๋ ๊ท ์ผํ ์ค๋ฅ ์ฅ์์ธ ๊ฒฝ์ฐ 1๋จ๊ณ->2๋จ๊ณ ์ ํ์ด ์ด์ํด ๋ณด์ ๋๋ค. ํ๋์ ์ถ๊ตฌ ์ง์ ์ ํน์ ์ฅ์ ๋นํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ defer๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค(์ด์ค ์ฅ์์ ํผํ๊ธฐ ์ํด). ๊ทธ๋ฐ ๋ค์ N์ ์ฌ์ฉํ์ฌ try ์ฌ์ฉ์ if ๋ฌธ์ผ๋ก desugarํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐํ ์ง์ ์ ๋ฐฉ๋ฌธํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. -1๊ฐ์ ์ค๋ฅ๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฅ์๋๊ณ 1๊ฐ์ ์ค๋ฅ๊ฐ ๋ค๋ฅด๊ฒ ์ฅ์๋ฉ๋๋ค.
return
break
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด 1.12์์ ๋น์ ๋ฐํ๋ ๊ณณ์
๋๋ค. for range once { ... }
๋ธ๋ก์์ once = "1"
๋ฅผ ์ฌ์ฉํ์ฌ ์ข
๋ฃํ๋ ค๋ ์ฝ๋ ์ํ์ค๋ฅผ ๊ตฌ๋ถํ ๋ค์ ๋จ ํ๋์ ์ค๋ฅ๋ง ์ฅ์ํด์ผ ํ๋ ๊ฒฝ์ฐ break
์ง์ ์์ ์ํํฉ๋๋ค. return
๋ฐ๋ก ์์ ์ํํฉ๋๋ค.
์ด๊ฒ์ด ์ข์ ํจํด์ธ ์ด์ ๋ ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ํ๋ ฅ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ก์ด ์๊ตฌ ์ฌํญ์ ๊ตฌํํ๊ธฐ ์ํด ์์ ์ฝ๋๋ฅผ ์ค๋จํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ IMO ๋ฐฉ์์ ์์ ๋ถ๋ถ์ผ๋ก ๋๋์๊ฐ์ ๋น ์ ธ๋์ค๊ธฐ ์ ์ ์ ํํ๋ ๊ฒ๋ณด๋ค ๋ ๊นจ๋ํ๊ณ ๋ถ๋ช ํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
๋ด ๋ฒค์น๋งํฌ์ ๋ํ @randall77 ์ ๊ฒฐ๊ณผ๋ 1.12 ๋ฐ ํ ๋ชจ๋์ ๋ํด ํธ์ถ ์ค๋ฒํค๋๋น 40+ns๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด๋ defer๊ฐ ์ต์ ํ๋ฅผ ์ต์ ํ ์ ์์์ ์๋ฏธํ๋ฉฐ, ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ ํตํด ๋ ผ์์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
@networkimprov Defer๋ ํ์ฌ ์ต์ ํ๋ฅผ ๊ธ์งํ๋ฉฐ, ์ด๋ ์ฐ๋ฆฌ๊ฐ ์์ ํ๊ณ ์ ํ๋ ๋ถ๋ถ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ฐ ํธ์ถ์ ์ธ๋ผ์ธํ๋ ๊ฒ์ฒ๋ผ ์ง์ฐ๋ ํจ์์ ๋ณธ๋ฌธ์ ์ธ๋ผ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฐ์ ์ ํ๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ ์ฃผ์ฅ์ ์ด๋์์ ์์ต๋๊น?
๊ทธ ์ฃผ์ฅ์ ์ด๋์์ ์์ต๋๊น?
์ค๋ฅ ๋ํ์ ์ฐ๊ธฐํ๋ ํจ์์ ํธ์ถ ์ค๋ฒํค๋๋น 40+ns๋ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
1.13์ ๋ณ๊ฒฝ ์ฌํญ์ ์ง์ฐ ์ต์ ํ์ ์ผ๋ถ์ ๋๋ค. ๋ค๋ฅธ ๊ฐ์ ์ฌํญ์ด ๊ณํ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋์์ธ ๋ฌธ์์ ์์ ์ด๋ ์ง์ ์์ ์ธ์ฉ๋ ๋์์ธ ๋ฌธ์์ ์ผ๋ถ์์ ๋ค๋ฃน๋๋ค.
๋ค์ swtch.com/try.html ๋ฐ https://github.com/golang/go/issues/32437#issuecomment -502192315:
@rsc , ๋งค์ฐ ์ ์ฉํฉ๋๋ค! ์์ง ์์ ์ค์ด๋ผ๋ฉด #id ๋ฌธ์ ์ฐธ์กฐ๋ฅผ ์ฐ๊ฒฐํ์๊ฒ ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ธ๊ผด ์คํ์ผ์ ์ฐ์ธ๋ฆฌํ์ฒด?
๊ทธ ํ์ด์ง๋ ์ฝํ ์ธ ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ ๋๋ง ์ธ๋ถ ์ฌํญ์ ์ง์คํ์ง ๋ง์ญ์์ค. ๋๋ ๋ณ๊ฒฝ๋์ง ์์ ์ ๋ ฅ ๋งํฌ๋ค์ด(GitHub-specific #id ๋งํฌ ์์)์์ blackfriday์ ์ถ๋ ฅ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ serif ๊ธ๊ผด์ ๋ง์กฑํฉ๋๋ค.
๋ค์ ๋นํ์ฑํ/๊ฒํ ์๋ :
์ฃ์กํฉ๋๋ค. ํน์ Go ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ ์ปดํ์ผ๋ฌ ์ต์ ๋ ์์ ๊ฒ์ด๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ง๋ผ๋ ์์์ฌ ๊ฒ์ฌ๋ ์์ ๊ฒ์ ๋๋ค. ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋๊ฑฐ๋ ๊ฒ์ฌํ ๋งํผ ๋์๋ฉด ๋ฃ์ง ์์ต๋๋ค. ๋ฐ๋๋ก ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ปดํ์ผ๋ฌ ํ๋๊ทธ ์ ํ์ ๋ฐ๋ผ ๊ฐ ๊ฐ๋ฐ์๋ง๋ค ๋ค๋ฅธ ์ธ์ด๊ฐ ์๋๋ผ ํ๋์ Go ์ธ์ด๊ฐ ์์ต๋๋ค.
@mikeschinkel , ์ด ๋ฌธ์ ์ ๋ํด ๋ ๋ฒ์ด๋ try ์ฌ์ฉ์ _ignoring_ ์ค๋ฅ๋ก ์ค๋ช
ํ์ต๋๋ค.
6์ 7์ผ ์ "๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ๋ฌด์ํ ์ ์๋๋ก ํฉ๋๋ค"๋ผ๋ ์ ๋ชฉ ์๋์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์๊ฒฌ์ ์์ ํ ๋ฐ๋ณตํ ๊ฒ์ด์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก
try()
๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ค์์ ๋จ์ํ idomatic ์ฝ๋๋ก ์์ฉํ๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๋ฉด์์ ์ ์ฌํ๋ฉฐ ์ด๊ฒ์ ์ด๋ค ์ฝ๋์๋ ์ ๋ ๋ค์ด๊ฐ์ง ์๋ ์ฝ๋์ ๋๋ค. -๊ฐ๋ฐ์ ๋ฐฐ์ก ์กด์ค:f, _ := os.Open(filename)
๋๋ ๋ด ์์ ์ ์ฝ๋๋ฅผ ๋ ์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ์์ฒญ๋๊ฒ ์ ์ฉํ ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ๋ค๋ฅธ Go ๊ฐ๋ฐ์๋ค์๊ฒ ์์กดํ๊ณ ์๋ค๋ ๊ฒ๋ ์๋๋ค. ๊ทธ๋ฌ๋ _"Other People's Code(tm)"_ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ ์ข ์ข ๋ฌด์๋ฉ๋๋ค.
์ ๋ง ์ง์งํ๊ฒ, ๊ฐ๋ฐ์๊ฐ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ๋ฌด์ํ๊ณ GitHub๋ฅผ ๊ฒฌ๊ณ ํ์ง ์์ ํจํค์ง๋ก ๋๋ฝํ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๊น?
๊ทธ๋ฆฌ๊ณ 6์ 14์ผ ์ ๋ค์ try๋ฅผ "์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ ์ฝ๋"๋ผ๊ณ ์ธ๊ธํ์ต๋๋ค.
f, _ := os.Open(filename)
์ฝ๋ ์กฐ๊ฐ์ด ์๋๋ผ๋ฉด "์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ๋ฐํ"์ ์ค๋ฅ๋ฅผ "๋ฌด์"ํ๋ ๊ฒ์ผ๋ก ํน์ฑํํ์ฌ ๋จ์ํ ๊ณผ์ฅํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ๋ฌธ์๋ ์ธ์ด ์ฌ์์์ ์ด๋ฏธ ๋ต๋ณ๋ ๋ง์ ์ง๋ฌธ ๊ณผ ํจ๊ป ์ฝ๋ ์กฐ๊ฐ์ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๊ฐ ๋์ผํ ์๋ฏธ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋์ง ๊ถ๊ธํ๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ๋ผ์ ๊ทํ์ ์ง๋ฌธ์ ๋ช
ํํ๊ณ ๋ต๋ณํ๊ธฐ ์ํด:
์ ์์ ์ฝ๋๋ฅผ ์ฐ๊ตฌํ ๋ ๋์์ด ๋ช ํํ์ง ์๊ณ ์ถ๋ก ํ๊ธฐ๊ฐ ๋ค์ ์ด๋ ต๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
try()
์์ ๋ํํ๋ ๊ฒ์ ๋ณผ ๋ ์ค๋ฅ๊ฐ ๋ฐํ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
try(f())
๊ฐ ํ์๋ ๋ f()
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด try
๋ ์ฝ๋ ์คํ์ ์ค์งํ๊ณ try
๋ณธ๋ฌธ์ ํจ์์์ ํด๋น ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
์ค๋ฅ๊ฐ ๊ทธ๋ฅ ๋ฌด์๋ฉ๋๊น?
์๋์. ์ค๋ฅ๋ ๋ฌด์๋์ง ์์ต๋๋ค. return ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ๋ฐํ๋ฉ๋๋ค. ์ฒ๋ผ:
{ err := f(); if err != nil { return err } }
์๋๋ฉด ์ฒซ ๋ฒ์งธ ๋๋ ๊ฐ์ฅ ์ต๊ทผ์
defer
,
์๋ฏธ๋ return ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ง์ฐ๋ ํจ์๋ " ์ง์ฐ๋ ์ญ์ ์ผ๋ก" ์คํ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋์ผ๋ก
err
๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ํด๋ก์ ๋ด๋ถ์ ์ค์ ํ๊ฑฐ๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค _(๋งค๊ฐ๋ณ์๊ฐ ํ์๋์ง ์์ต๋๊น?)_.
์๋ฏธ๋ return ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ง์ฐ๋ ํจ์ ๋ณธ๋ฌธ์์ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค. https://golang.org/ref/spec#Defer_statements์์ result
์์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋ ์ค๋ฅ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์ ํฉ๋๊น? ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๋ด ํจ์์์ ๋ด
err
๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค๋ ์๋ฏธ์ ๋๊น?
์๋ฏธ๋ return ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
return ๋ฌธ์ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ์ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ด ์ง์ ๋์์ง๋ง ์์ ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ํญ์ ์ค์ ํจ์ ๊ฒฐ๊ณผ์ ํ ๋นํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋
defer
๋ฅผ ํธ์ถํฉ๋๊น? ์ญ์์ผ๋ก ๋๋ ์ผ๋ฐ ์์๋ก?
์๋ฏธ๋ return ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ง์ฐ๋ ํจ์๋ " ์ง์ฐ๋ ์ญ์ ์ผ๋ก" ์คํ๋ฉ๋๋ค. (์ญ์์ ์ผ๋ฐ์์ ๋๋ค.)
์๋๋ฉด ํด๋ก์ ์ ์ค๋ฅ๊ฐ ๋ฐํ๋
func
๋ชจ๋์์ ๋ฐํ๋ฉ๋๊น? _(์ฌ๊ธฐ์์ ๊ทธ๊ฒ์ ์๋ฏธํ๋ ๋จ์ด๋ฅผ ์ฝ์ง ์์๋ค๋ฉด ๊ฒฐ์ฝ ๊ณ ๋ คํ์ง ์์์ ๊ฒ์ ๋๋ค.)_
์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด์ง๋ง ์๋ง๋ ๋๋ต์ ์๋์ค์ ๋๋ค. ์ ์์ ํ ์คํธ์ ์ฌ์์ ์ด์ ์ ๋ง์ถ๊ณ ํด๋น ํ ์คํธ๊ฐ ์๋ฏธํ๊ฑฐ๋ ์๋ฏธํ์ง ์์ ์ ์๋ ๋ค๋ฅธ ์ค๋ช ์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์์์ ์ง๊ธ๊น์ง์ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์ ํ์๋ ์์งํ ์์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ _"Captain Obvious"_๋ฅผ ์นํธํ๋ ์ธ์ด์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ ๋๊น?
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋จ์ํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ธ์ด๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค. ์ง๋ฌธ์ด ๋๋ฌด ๋ง์ ์ฃ์กํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ์์ ์ค์ ๋ก ๊ฐ๋ฅํ ํ ๋ง์ ๊ธฐ์กด ์ธ์ด๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก(ํนํ ์ฐ๊ธฐ), ๋ฐฐ์ธ ์ถ๊ฐ ์ธ๋ถ ์ฌํญ์ด ๊ฑฐ์ ์์ด์ผ ํฉ๋๋ค. ์ผ๋จ ๋น์ ์ด ๊ทธ๊ฒ์ ์๊ณ
x, y := try(f())
์๋จ
tmp1, tmp2, tmpE := f()
if tmpE != nil {
return ..., tmpE
}
x, y := tmp1, tmp2
๋ค๋ฅธ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ๊ทธ ์ ์์ ์๋ฏธ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ค๋ฅ๋ฅผ "๋ฌด์"ํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ๋ ์ค๋ฅ๋ฅผ ๋ฌด์ํฉ๋๋ค.
c, _ := net.Dial("tcp", "127.0.0.1:1234")
io.Copy(os.Stdout, c)
net.Dial์ด ์คํจํ๊ณ ์ค๋ฅ๊ฐ ๋ฌด์๋์๊ธฐ ๋๋ฌธ์ ์ฝ๋ ํจ๋์ด ๋ฐ์ํ์ต๋๋ค. c๋ nil์ด๊ณ c.Read์ ๋ํ io.Copy์ ํธ์ถ์ ์ค๋ฅ์ ๋๋ค. ๋์กฐ์ ์ผ๋ก ์ด ์ฝ๋๋ ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ๋ฐํํฉ๋๋ค.
c := try(net.Dial("tcp", "127.0.0.1:1234"))
io.Copy(os.Stdout, c)
์ฐ๋ฆฌ๊ฐ ์ ์๋ณด๋ค ํ์๋ฅผ ์ฅ๋ คํ๊ธฐ๋ฅผ ์ํ๋์ง ์ฌ๋ถ์ ๋ํ ๊ทํ์ ์ง๋ฌธ์ ๋ตํ์๋ฉด: ๊ทธ๋ ์ต๋๋ค.
@damienfamed75 ๊ทํ ๊ฐ ์ ์ํ emit
๋ฌธ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ ๋์์ธ ์ handle
๋ฌธ๊ณผ ๋์ผํด ๋ณด์
๋๋ค. handle
์ ์ธ์ ํฌ๊ธฐํ ์ฃผ๋ ์ด์ ๋ defer
์ ๊ฒน์ณค๊ธฐ ๋๋ฌธ์
๋๋ค. emit
๊ฐ ๋ฌ์ฑํ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด defer
๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๋ช
ํํ์ง ์์ต๋๋ค.
@dominikh ๋ ๋ค์๊ณผ ๊ฐ์ด ์ง๋ฌธํ์ต๋๋ค .
acme๊ฐ ๊ฐ์กฐ ํ์๋ฅผ ์์ํ ๊น์?
์๋ ์ ์์ ๋ํ ๋ง์ ๋ถ๋ถ์ด ๋ฏธ์ ์ด๋ฉฐ ์๋ ค์ง์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด ์ง๋ฌธ์ ๋๋ ํ์คํ ๋๋ตํ ์ ์์ต๋๋ค. ์๋์.
@rsc
๋น์ ์ ์๋ต์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
_"์ด ๋ฌธ์ ์ ๋ํด ๋ ๋ฒ์ด๋ ์ค๋ฅ ๋ฌด์๋ก try ์ฌ์ฉ์ ์ค๋ช ํ์ต๋๋ค."_
์, ๋ด ๊ด์ ์ ์ฌ์ฉํ์ฌ ๊ธฐ์ ์ ์ผ๋ก ์ ํํ์ง ์์ ๋๊ธ์ ๋ฌ์์ต๋๋ค.
๋ด๊ฐ ์๋ฏธํ ๊ฒ์ _"์ค๋ฅ๊ฐ ์ฅ์๋์ง ์๊ณ ์ ๋ฌ๋๋๋ก ํ์ฉํ๋ ๊ฒ"์ ๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ _"๋ฌด์"_์ ๋๋ค. ์ฌ๋๋ค์ด ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค _"๋ฌด์"_ ํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ๋๋์ง ํ์คํ ์ ์ ์์ต๋๋ค. ๋ด ํํ์ด ๊ธฐ์ ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ๋ด ๋๋ค.
_"
try(f())
๊ฐ ํ์๋ ๋f()
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด try๋ ์ฝ๋ ์คํ์ ์ค์งํ๊ณ try๊ฐ ๋ํ๋๋ ๋ณธ๋ฌธ์ ํจ์์์ ํด๋น ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค."_
๊ทธ๊ฒ์ ์ผ๋ง ์ ์ ๋ด ์๊ฒฌ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด์์ง๋ง ์ง๊ธ์ ๊ทธ๊ฒ์ ์์๋์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋๋ฅผ ์ฌํ๊ฒ ๋ง๋๋ ๋ ๊ฐ์ง ์ผ์ ํ๋ ๊ฒ์ผ๋ก ๋๋ฉ๋๋ค. ์์ธ:
์ฅ์ ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด ์ ํญ์ ์ต์ํํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค์ด ๋ง์ ๊ฐ๋ฐ์๊ฐ ๊ทธ๋ ๊ฒ ํ๋๋ก ์ฅ๋ คํ๊ณ ๋ง์ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ํด๋น ์ฝ๋๋ฅผ ๊ฒ์ํ์ฌ ๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ/์ค๋ฅ ๋ณด๊ณ ๋ก ๋ ๋ฎ์ ํ์ง์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค. .
return
๋์ break
๋ฐ continue
๋ฅผ ์ฌ์ฉํ๋ ์ ์ ๊ฐ์ ์ฌ๋๋ค์๊ฒ๋ ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ๋ ํ๋ ฅ์ ์ธ ํจํด์ธ try()
, ์ค๋ฅ์ ์ฃผ์์ ๋ฌ ์ด์ ๊ฐ ์ค์ ๋ก ์๋ ๊ฒฝ์ฐ์๋.
_"๋๋ ์ค๋ฅ๊ฐ ๋ฐํ๋ ํจ์์ ํด๋ก์ ๋ชจ๋์์ ๋ฐํ๋ ๊ฒ์ ๋๊น? (์ฌ๊ธฐ์์ ์ด๋ฅผ ์์ํ๋ ๋จ์ด๋ฅผ ์ฝ์ง ์์๋ค๋ฉด ์ ๋ ๊ณ ๋ คํ์ง ์์์ ๊ฒ์ ๋๋ค.)"_
_"์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด์ง๋ง ์๋ง๋ ๋๋ต์ ์๋์ค์ผ ๊ฒ์ ๋๋ค. ์ ์ ํ ์คํธ์ ์ฌ์์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ํ ์คํธ๊ฐ ์๋ฏธํ๊ฑฐ๋ ์๋ฏธํ์ง ์์ ์ ์๋ ๋ค๋ฅธ ์ค๋ช ์๋ ๊ด์ฌ์ด ์์ต๋๋ค."_
๋ค์, ๊ทธ ์ง๋ฌธ์ ์ผ์ฃผ์ผ ์ ์ ์์์ผ๋ฏ๋ก ์ด์ ๋ ์ ์ดํดํ ์ ์์ต๋๋ค.
๋ช
ํํ ํ์๋ฉด defer
์๋ ํด๋ก์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ฃ ? ๊ทธ ํด๋ก์ ์์ ๋์์ค๋ฉด - ๋ด๊ฐ ์๋ชป ์ดํดํ์ง ์๋ ํ - ํด๋ก์ ์์ ๋ฐํ๋ ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ func
์์๋ ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ ์ฃ ? _(์์ธ ๊ฒฝ์ฐ ๋ต์ฅํ ํ์๊ฐ ์์ต๋๋ค.)_
func example() {
defer func(err) {
return err // returns from both defer and example()
}
try(SomethingThatReturnsAnError)
}
BTW, ๋ด ์ดํด๋ try()
์ ๋ํ ์ด์ ๋ ๊ฐ๋ฐ์๊ฐ ์์ฉ๊ตฌ์ ๋ํด ๋ถํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ ๋ํ ์ด ์์ฉ๊ตฌ๋ฅผ ์ด๋ํ๋ ๋ฐํ๋ ์ค๋ฅ๋ฅผ ์๋ฝํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฅธ ๋ง์ ์ธ์ด๋ณด๋ค Go ์ฑ์ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ฌํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๋น์ ์ด ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๋ ๊ฒ์ ๋ฌด์ํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ์ง ์๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ ๋ํด ์์์ ๋ถ๊ณผํ๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค.
BTW, ์ผ๋ถ ์ฌ๋๋ค์ ๋ค์ ์ค ํ๋์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ์ํ์ต๋๋ค _(์๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ธฐ ์ํด ๊ฐ์์ .Extend()
๋ฅผ ์ถ๊ฐํ์ต๋๋ค):_
f := try os.Open(filename) else err {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
๋๋
try f := os.Open(filename) else err {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ด๊ฒ์ ๋ํด ์ค์ ๋ก ์ด๋ค ๋ฌธ์๋ ์ ์ฅํ์ง ์๋๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
f,err := os.Open(filename)
if err != nil {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
๊ทธ๋ฌ๋ ๋นํ์์ ๋๋ฝ๋ ํ ๊ฐ์ง๋ 5์ค์์ 4์ค๋ก ์ด๋ ํ์ฌ ์์ง ๊ณต๊ฐ์ด ์ค์ด๋ค๊ณ ํนํ func
์์ ์ด๋ฌํ ๊ตฌ์ฑ์ด ๋ง์ด ํ์ํ ๋ ์ค์ํด ๋ณด์
๋๋ค.
์์ง ๊ณต๊ฐ์ 40%๋ฅผ ์ ๊ฑฐํ๋ ์ด์ ๊ฐ์ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ต๋๋ค.
try f := os.Open(filename)
else err().Extend("Cannot open file %s",filename)
end //break, continue or return err
#fwiw
์ด์จ๋ , ์์ ๋งํ๋ฏ์ด ๋ฐฐ๊ฐ ์ถํญํ ๊ฒ ๊ฐ์ผ๋ ๋๋ ๊ทธ๊ฒ์ ๋ฐ์๋ค์ด๋ ๋ฒ์ ๋ฐฐ์ธ ๊ฒ์ ๋๋ค.
๋ชฉํ
์ฌ๊ธฐ์ ์๋ ๋ช ๊ฐ์ง ์๊ฒฌ์ ์ ์์ผ๋ก ์ฐ๋ฆฌ๊ฐ ํ๋ ค๋ ๊ฒ์ด ๋ฌด์์ธ์ง์ ๋ํด ์๋ฌธ์ ์ ๊ธฐํ์ต๋๋ค. ์ง๋ 8์์ ๋ฐํํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ์ค๋ช ์ "๋ชฉํ" ์น์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋์ ์์ต๋๋ค.
"Go 2์ ๊ฒฝ์ฐ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ๋ณด๋ค ๊ฐ๋ณ๊ฒ ๋ง๋ค์ด ์ค๋ฅ ๊ฒ์ฌ ์ ์ฉ Go ํ๋ก๊ทธ๋จ ํ ์คํธ์ ์์ ์ค์ด๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค๊ณ , ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฅผ ์ํํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค.
์ค๋ฅ ๊ฒ์ฌ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ชจ๋ ๋ช ์์ ์ผ๋ก ์ ์ง๋์ด์ผ ํ๋ฉฐ ์ด๋ ํ๋ก๊ทธ๋จ ํ ์คํธ์์ ๋ณผ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์์ธ ์ฒ๋ฆฌ์ ํจ์ ์ ๋ฐ๋ณตํ๊ณ ์ถ์ง ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋๋ ๊ณ์ ์๋ํด์ผ ํ๋ฉฐ ์ค๋๋ ์ฒ๋ผ ์ ํจํด์ผ ํฉ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ์กด ์ฝ๋์ ์ํธ ์ด์ฉ๋์ด์ผ ํฉ๋๋ค."
"์์ธ ์ฒ๋ฆฌ์ ํจ์ "์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ ๊ธด "๋ฌธ์ " ์น์ ์ ๋ ผ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ํนํ, ์ค๋ฅ ๊ฒ์ฌ๋ ๊ฒ์ฌ ๋์์ ๋ช ํํ๊ฒ ์ฒจ๋ถ๋์ด์ผ ํฉ๋๋ค.
@mikeschinkel ,
๋ช ํํ ํ์๋ฉด,
defer
์๋ ํด๋ก์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ฃ ? ํด๋น ํด๋ก์ ์์ ๋์์ค๋ฉด - ๋ด๊ฐ ์คํดํ์ง ์๋ ํ - ํด๋ก์ ์์ ๋ฐํ๋ ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๊ฐ ๋ฐ์ํfunc
์์๋ ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ ์ฃ ? _(์์ธ ๊ฒฝ์ฐ ๋ต์ฅํ ํ์๊ฐ ์์ต๋๋ค.)_
์๋์. ์ด๊ฒ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ง์ฐ๋ ํจ์์ ๊ดํ ๊ฒ์ ๋๋ค. ํญ์ ํ์๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ฐ์ ์ธ ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func (d *Data) Op() int {
d.mu.Lock()
defer d.mu.Unlock()
... code to implement Op ...
}
d.Op์ ๋ชจ๋ ๋ฐํ์ return ๋ฌธ ์ดํ์ d.Op์ ํธ์ถ์์๊ฒ ์ฝ๋๊ฐ ์ ์ก๋๊ธฐ ์ ์ ์ง์ฐ๋ ์ ๊ธ ํด์ ํธ์ถ์ ์คํํฉ๋๋ค. d.mu.Unlock ๋ด๋ถ์์ ์ํ๋ ์์ ์ d.Op์ ๋ฐํ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. d.mu.Unlock์ return ๋ฌธ์ Unlock์์ ๋ฐํ๋ฉ๋๋ค. ์์ฒด์ ์ผ๋ก d.Op์์ ๋ฐํ๋์ง ์์ต๋๋ค. ๋ฌผ๋ก d.mu.Unlock์ด ๋ฐํ๋๋ฉด d.Op๋ ๋ฐํ๋์ง๋ง d.mu.Unlock ๋๋ฌธ์ ์ง์ ์ ์ผ๋ก ๋ฐํ๋๋ ๊ฒ์ ์๋๋๋ค. ์ฌ์ํ์ง๋ง ์ค์ํ ํฌ์ธํธ์ ๋๋ค.
๊ทํ์ ์์ ๋๋ฌํ๊ธฐ:
func example() { defer func(err) { return err // returns from both defer and example() } try(SomethingThatReturnsAnError) }
์ ์ด๋ ์ฐ์ฌ์ง ๋๋ก ์ด๊ฒ์ ์๋ชป๋ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ ๋ ํํ์ ์ผ๋ก ๋งํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค. ์ธ๋ถ ์ฌํญ์ด ์ค์ํฉ๋๋ค. ์ ํจํ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func example() (err error) {
defer func() {
if err != nil {
println("FAILED:", err.Error())
}
}()
try(funcReturningError())
return nil
}
์ง์ฐ๋ ํจ์ ํธ์ถ์ ๋ชจ๋ ๊ฒฐ๊ณผ๋ ํธ์ถ์ด ์คํ๋ ๋ ํ๊ธฐ๋๋ฏ๋ก ์ง์ฐ๋ ๊ฒ์ด ํด๋ก์ ์ ๋ํ ํธ์ถ์ธ ๊ฒฝ์ฐ ๊ฐ์ ๋ฐํํ๋๋ก ํด๋ก์ ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋ก์ ๋ณธ๋ฌธ ๋ด๋ถ์ return err
๋ฅผ ์์ฑํ๋ฉด ์ปดํ์ผ๋ฌ๋ "too many arguments to return" ์ ์๋ ค์ค๋๋ค.
๋ฐ๋ผ์ return err
๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ค์ ์๋ฏธ์์ ์ง์ฐ๋ ํจ์์ ์ธ๋ถ ํจ์ ๋ชจ๋์์ ๋ฐํ๋์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ๋ฒ์์๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๊ฒ์๋ ๋ง์ ๋ฐ๋ ์ ์์ if ๋ฌธ๊ณผ ๊ฐ์ ๊ธฐ์กด ์ธ์ด ๊ตฌ์ฑ์ ๋ณต์ ํ๋ ๋ค๋ฅธ ๋ ์ ๋ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ์ ์ํฉ๋๋ค. (๋๋ "์ค๋ฅ ๊ฒ์ฌ๋ฅผ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋ค๊ณ ์ค๋ฅ ๊ฒ์ฌ์ ํ์ํ Go ํ๋ก๊ทธ๋จ ํ ์คํธ์ ์์ ์ค์ธ๋ค"๋ ๋ชฉํ ์ ์ถฉ๋ํฉ๋๋ค.)
์ผ๋ฐ์ ์ผ๋ก Go๋ ์ด๋ฏธ ์๋ฒฝํ๊ฒ ๊ฐ๋ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ์ฒด ์ธ์ด, ํนํ if ๋ฌธ์ ๋๋ค. @DavexPro ๋ Go ๋ธ๋ก๊ทธ ํญ๋ชฉ Errors are values โโ๋ฅผ ๋ค์ ์ฐธ์กฐํ๋ ๊ฒ์ด ์ณ์์ต๋๋ค . ์ฐ๋ฆฌ๋ ์ค๋ฅ์ ๊ด๋ จ๋ ์์ ํ ๋ณ๋์ ํ์ ์ธ์ด๋ฅผ ์ค๊ณํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ทธ๋ ๊ฒ ํด์๋ ์ ๋ฉ๋๋ค. ์ง๋ ๋ฐ๋ ์ ๋ ๋์์ ์ฃผ์ ํต์ฐฐ๋ ฅ์ ์ ์ ํ ๊ฒฝ์ฐ if ๋ฌธ์ผ๋ก ๋๋์๊ฐ๋ ๊ฒ์ ํฌํจํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ธ์ด๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด "check/handle" ์ ์์์ "handle"์ ์ ๊ฑฐํ ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ ํ ์ ๊ฒ ํ๋ ๊ฒ์ ๋ํ ์ด๋ฌํ ๊ด์ฐฐ์ ์๋ก์ด ๊ตฌ์ฑ์ ์ถ๊ฐ๋ก ๋งค๊ฐ๋ณ์ํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋๋ถ๋ถ์ ์์ด๋์ด๋ฅผ ๊ณ ๋ ค์์ ์ ์ธํฉ๋๋ค.
๋ง์ ์ข์ ์๊ฒฌ์ ์ฃผ์ @brynbellomy ๋๋ถ์ ๋๋ ๊ทธ์ try-else๋ฅผ ์์๋ก ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
func doSomething() (int, error) {
// Inline error handler
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
handler logAndContinue err {
log.Errorf("non-critical error: %v", err)
}
handler annotateAndReturn err {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d := try SomeFunc() else logAndContinue
e, f := try OtherFunc() else annotateAndReturn
// ...
return 123, nil
}
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๊ณ ๋ ค๋๋ ๋ชจ๋ ๊ฒ์ ์๋ง๋ ๊ธฐ์กด ์ธ์ด ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํฌ๊ฒ ๊ฐ์ ๋์ง ์์ ๊ฒ์ ๋๋ค.
func doSomething() (int, error) {
a, b, err := SomeFunc()
if err != nil {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
logAndContinue := func(err error) {
log.Errorf("non-critical error: %v", err)
}
annotate:= func(err error) (int, error) {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d, err := SomeFunc()
if err != nil {
logAndContinue(err)
}
e, f, err := SomeFunc()
if err != nil {
return annotate(err)
}
// ...
return 123, nil
}
์ฆ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ ผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๊ธฐ์กด ์ธ์ด์ ๊ณ์ ์์กดํ๋ ๊ฒ์ด try-else, try-goto, try-arrow ๋ฑ ๋ฌด์์ด๋ ์ ๋ช ๋ น๋ฌธ์ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ด try
๊ฐ ๋จ์ํ ์๋ฏธ if err != nil { return ..., err }
๋ก ์ ํ๋๋ ์ด์ ์
๋๋ค. ํ๋์ ๊ณตํต ํจํด์ ์ค์ด๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ ์ด ํ๋ฆ์ ์ฌ๋ฐ๋ช
ํ์ง ๋ง์ญ์์ค. if ๋ฌธ์ด๋ ๋์ฐ๋ฏธ ํจ์๊ฐ ์ ์ ํ๋ฉด ์ฌ๋๋ค์ด ๊ณ์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
@rsc ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ง์์, ์ ๊ฐ ์ธ๋ถ์ฌํญ์ ์ ๋๋ก ๋ชป ์์๋ค์์ด์. defer
๊ตฌ๋ฌธ์ ๊ธฐ์ตํ ๋งํผ ์์ฃผ ์ฌ์ฉํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
_(FWIW ๋ฐํํ๊ธฐ ์ ์ func
์์ ๋ค๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ ํ์ผ ํธ๋ค์ ๋ซ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ ๊ฒฝ์ฐ defer
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐพ์์ต๋๋ค. ๋ฐ๋ผ์ ํญ์ ํด๋น ์ฝ๋๋ฅผ ๋์ func
for range once{...}
๋ด ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ break
s out.)_
์ฌ๋ฌ ์ค์ ๋ํ ๋ชจ๋ ์๋ ํธ์ถ gofmt์ ๋ํ ์ ์์ "์ค๋ฅ ๊ฒ์ฌ๋ฅผ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋ค๊ณ ์ค๋ฅ ๊ฒ์ฌ์ ํ์ํ Go ํ๋ก๊ทธ๋จ ํ ์คํธ์ ์์ ์ค์ธ๋ค"๋ ๋ชฉํ ์ ์ง์ ์ ์ผ๋ก ์ถฉ๋ํฉ๋๋ค.
ํ ์ค์ ์๋ ์ค๋ฅ ํ ์คํธ if ๋ฌธ์ gofmt์ ์ ์ํ๋ ๊ฒ๋ ์ด ๋ชฉํ์ ์ง์ ์ ์ผ๋ก ์ถฉ๋ํฉ๋๋ค. ๋ด๋ถ ๊ฐํ ๋ฌธ์๋ฅผ ์ ๊ฑฐํด๋ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํจ์ฌ ๊ฐ๋ฒผ์์ง๊ฑฐ๋ ์์ด ์ค์ด๋ค์ง ์์ต๋๋ค. ๋ฌด์์ด๋ ํ์ด๋ณด๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
try์ ์ฃผ์ ์ด์ ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ํด ๋ช ํํ ์ฝ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ดํ ๊ฒฝ์ฐ๋ฅผ ์ฃผ์ ๊น๊ฒ ์ฝ์ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ๋์ฑ ๋๋ณด์ด๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
gofmt์์ ์ผ๋ฐ ๋๊ตฌ๋ก ๋ฐฑ์ ํ ๋ ์ธ์ด ๋ณ๊ฒฝ ๋์ ์ค๋ฅ ๊ฒ์ฌ ์์ฑ์ ์ํ ๋๊ตฌ์ ์ง์คํ๋ผ๋ ์ ์ ๋ ๋๊ฐ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Abelson๊ณผ Sussman์ด ๋งํ๋ฏ์ด "ํ๋ก๊ทธ๋จ์ ์ฌ๋์ด ์ฝ์ ์ ์๋๋ก ์์ฑ๋์ด์ผ ํ๋ฉฐ, ๊ธฐ๊ณ๊ฐ ์คํํ๋๋ก ๋ถ์์ ์ผ๋ก๋ง ์์ฑ๋์ด์ผ ํฉ๋๋ค." ์ธ์ด์ ๋์ฒํ๊ธฐ ์ํด ๊ธฐ๊ณ ๋๊ตฌ๊ฐ _ํ์ํ๋ค๋ฉด_ ์ธ์ด๊ฐ ์ ์ญํ ์ ํ์ง ๋ชปํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ ์ฑ์ ํน์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ง ๊ตญํ๋์ด์๋ ์ ๋ฉ๋๋ค.
๋ช๋ช ์ฌ๋๋ค์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ ผ๋ฆฌ๋ฅผ ์คํํ์ต๋๋ค. ์ฌ๋๋ค์ ๋ณต์กํ ํํ์์ ์์ฑํ ์ ์์ผ๋ฏ๋ก ํ์ฐ์ ์ผ๋ก ๊ทธ๋ ๊ฒ ํ๋ฏ๋ก try ํํ์์ ์ฐพ์ผ๋ ค๋ฉด IDE ๋๋ ๊ธฐํ ๋๊ตฌ ์ง์์ด ํ์ํ๋ฏ๋ก try๋ ๋์ ์๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์ง์๋์ง ์๋ ๋ช ๊ฐ์ง ๋์ฝ์ด ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ณต์กํ๊ณ ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด _๊ฐ๋ฅ_ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ์ฝ๋๊ฐ ์ ๋น์ฟผํฐ์คํ๊ฒ ๋ ๊ฒ์ด๋ผ๋ ์ฃผ์ฅ์ ๋๋ค. @josharian ์ด ์ธ๊ธํ๋ฏ์ด ์ด๋ฏธ " Go์์ ๊ฐ์ฆ์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค ." ๊ฐ๋ฐ์๋ ํน์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋ํ ๊ท๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ํํ ์ผ์ด ์๋๋๋ค. ๋ฐ๋ผ์ try์ ๊ด๋ จ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๊ธฐ ์ํด IDE ์ง์์ด ํ์ํ ๊ฒฝ์ฐ๋ _์๋๋๋ค_. ๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ด ์ ๋ง๋ก ๋์ฐํ ์ฝ๋ ๋จ์ฉ ์๋๋ฅผ ์์ฑํ๋ ์์์ ๊ฒฝ์ฐ์๋ IDE ์ง์์ด ๋ง์ด ์ฌ์ฉ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ด ๋ฐ๋๋ ๋ชจ๋ ์ธ์ด์ ๋ชจ๋ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ํ ๋ก ์์ ์ ๊ธฐ๋ฉ๋๋ค. ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค. ๋๋ฒ๊น ์ธ์์ ๋ํ ๋ ผ์ ์์์ ๊ฐ์ด "์ฌ๋๋ค์ด ์ฒ์์๋ ์ข์ ๋ณด์ด์ง๋ง ์ด ์๊ธฐ์น ์์ ์ด์ ๋ก ์ธํด ์ข์ง ์์ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค."๋ผ๋ ํ์์ ๋ฐ๋ ์๊ฒฌ์ด ๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง ๊ฐ๋
์ฑ์ ํน์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ๋ง ๊ตญํ๋์ด์๋ ์ ๋ฉ๋๋ค.
(๋๋ ์ฌ์ ํ ์ข
์ด์ ํ๋ก๊ทธ๋จ์ ์ธ์ํ๊ณ ์ฝ์ง๋ง ์ฌ๋๋ค์ ์ข
์ข
๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ๋ํด ์ด์ํ ํ์ ์ ์ง์ต๋๋ค.)
if
๋ฌธ์ ํ ์ค๋ก gofmtํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ํ ์๊ฒฌ์ ์ ๊ณตํด ์ฃผ์ @rsc ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ ์ค์ ์๋ ์ค๋ฅ ํ ์คํธ if ๋ฌธ์ gofmt์ ์ ์ํ๋ ๊ฒ๋ ์ด ๋ชฉํ์ ์ง์ ์ ์ผ๋ก ์ถฉ๋ํฉ๋๋ค. ๋ด๋ถ ๊ฐํ ๋ฌธ์๋ฅผ ์ ๊ฑฐํด๋ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํจ์ฌ ๊ฐ๋ฒผ์์ง๊ฑฐ๋ ์์ด ์ค์ด๋ค์ง ์์ต๋๋ค. ๋ฌด์์ด๋ ํ์ด๋ณด๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
๋๋ ์ด๋ฌํ ์ฃผ์ฅ์ ๋ค๋ฅด๊ฒ ํ๊ฐํฉ๋๋ค.
3์ค์์ 1์ค๋ก ์ค์ด๋ฉด ํจ์ฌ ๋ ๊ฐ๋ณ์ต๋๋ค. ์๋ฅผ ๋ค์ด 3๊ฐ ๋์ 9๊ฐ(๋๋ 5๊ฐ) ๊ฐํ์ ํฌํจํ๋ if ๋ฌธ์ ์๊ตฌํ๋ gofmt๊ฐ ํจ์ฌ ๋ ๋ฌด๊ฒ์ง ์์๊น์? ์ถ์/ํ์ฅ์ ๋์ผํ ์์(์)์
๋๋ค. ๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด์๋ ์ด์ ๊ฐ์ ์ ์ถฉ์ ์ด ์์ผ๋ฉฐ try
๋ฅผ ์ถ๊ฐํ๋ฉด if
๋ฌธ๋งํผ ์ ์ด ํ๋ฆ์ด ํ์ฉ๋ฉ๋๋ค.
๋ ๋ฒ์งธ๋ก, try
์ ๋๋ฑํ๊ฒ ์ ์ฉํ๊ธฐ ์ํด ํ์ด๋ณด๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋ค๋ ์ฃผ์ฅ์ด ์์ต๋๋ค. ์ต์ํ if
๋ฌธ์ ์์ฒด ๋ผ์ธ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ์ด ๋งฅ๋ฝ์์ "ํ์ง"๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๋ชป ์ดํดํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ "๋๋ถ๋ถ ๊ฑด๋ ๋ฐ์ง๋ง ์๊ณ ์๋ค"๋ผ๋ ์๋ฏธ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง gofmt ์ ์์ try
๋ณด๋ค ํจ์ฌ ๋ณด์์ ์ธ ์กฐ์น๋ฅผ ์ทจํ๋ ๊ฒ์ ์ ์ ๋ก ํ๋ฉฐ ์ถฉ๋ถํ์ง ์๋ ํ try
์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฏ๋ก ๋ ๋
ผ์ํ๊ณ ์ถ๋ค๋ฉด ์ ๋ฌธ์ /์ ์์ ์ด๊ฒ ์ต๋๋ค. :+1:
3์ค์์ 1์ค๋ก ์ค์ด๋ฉด ํจ์ฌ ๋ ๊ฐ๋ณ์ต๋๋ค.
์ฝ๋๊ฐ ๋๋ฌด ์กฐ๋ฐํ ์ ์๋ค๋ ์ ์๋ ๋ชจ๋๊ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ฒด ํจํค์ง๊ฐ ํ ์ค์ด๋ฉด ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ผ๋ ๋ฐ ์ฐ๋ฆฌ ๋ชจ๋ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋ ์๋ง๋ ์ ํํ ๋ผ์ธ์ ๋์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋๋ฅผ ์ํด ์ฐ๋ฆฌ๋
n, err := src.Read(buf)
if err == io.EOF {
return nil
} else if err != nil {
return err
}
ํด๋น ์ฝ๋์ ํ์์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๊ทํ์ ์์ ๋ก ์ด๋ํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋นํ ๊ฑฐ์ฌ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }
๋์ ์. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฐ ์์ผ๋ก ์์ํ๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ์ง ์์๊ณ ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์๋ ๊ณณ๋ ์๋๋๋ค.
๊ฐ์ธ์ ์ผ๋ก, ๋๋ ํ์ด๋ณด๊ธฐ๊ฐ ๋ ์ฝ๋ค๋ ์๋ฏธ์์ ํ์ด์ง์์ ์ ์์ ๋ ๊ฐ๋ฒผ์ด ๋ฌด๊ฒ๋ฅผ ์ฐพ์ต๋๋ค. ์ค์ ๊ธ์๋ฅผ ์ฝ์ง ์๊ณ ๋ if-else๋ฅผ ํ ๋์ ๋ณผ ์ ์์ต๋๋ค. ๋์กฐ์ ์ผ๋ก, ์กฐ๋ฐํ ๋ฒ์ ์ ์ผ๋ จ์ ์ธ ๋ฌธ์ฅ์ผ๋ก ์ธํด ํ ๋์ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ฆ, ์๋ฏธ๊ฐ ๋ช ํํด์ง๊ธฐ ์ ์ ๋ ์ฃผ์ ๊น๊ฒ ์ดํด๋ณด์์ผ ํฉ๋๋ค.
๊ฒฐ๊ตญ ๊ฐํ ์๋งํผ ๋ค๋ฅธ ์์น์ ๋ฐ๋ ๋ ๊ฐ๋ ์ฑ ์ ์ ๊ทธ๋ ค๋ ๊ด์ฐฎ์ต๋๋ค. try ์ ์์ ์ค ๋ฐ๊ฟ์ ์ ๊ฑฐํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๊ตฌ๋ฌธ์ ์์ ํ ์ ๊ฑฐํ๋ ๋ฐ ์ค์ ์ ๋๊ณ ์์ผ๋ฉฐ ์ด๋ gofmt ์ง๋ฌธ๊ณผ ๋ณ๊ฐ๋ก ๋ ๊ฐ๋ฒผ์ด ํ์ด์ง ์กด์ฌ๋ฅผ ์์ฑํฉ๋๋ค.
๋ช๋ช ์ฌ๋๋ค์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ ผ๋ฆฌ๋ฅผ ์คํํ์ต๋๋ค. ์ฌ๋๋ค์ ๋ณต์กํ ํํ์์ ์์ฑํ ์ ์์ผ๋ฏ๋ก ํ์ฐ์ ์ผ๋ก ๊ทธ๋ ๊ฒ ํ๋ฏ๋ก try ํํ์์ ์ฐพ์ผ๋ ค๋ฉด IDE ๋๋ ๊ธฐํ ๋๊ตฌ ์ง์์ด ํ์ํ๋ฏ๋ก try๋ ๋์ ์๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ์ง์๋์ง ์๋ ๋ช ๊ฐ์ง ๋์ฝ์ด ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ณต์กํ๊ณ ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด _๊ฐ๋ฅ_ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ์ฝ๋๊ฐ ์ ๋น์ฟผํฐ์คํ๊ฒ ๋ ๊ฒ์ด๋ผ๋ ์ฃผ์ฅ์ ๋๋ค. @josharian ์ด ์ธ๊ธํ๋ฏ์ด ์ด๋ฏธ " Go์์ ๊ฐ์ฆ์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค ." ๊ฐ๋ฐ์๋ ํน์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋ํ ๊ท๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ํํ ์ผ์ด ์๋๋๋ค. ๋ฐ๋ผ์ try์ ๊ด๋ จ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๊ธฐ ์ํด IDE ์ง์์ด ํ์ํ ๊ฒฝ์ฐ๋ _์๋๋๋ค_. ๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ด ์ ๋ง๋ก ๋์ฐํ ์ฝ๋ ๋จ์ฉ ์๋๋ฅผ ์์ฑํ๋ ์์์ ๊ฒฝ์ฐ์๋ IDE ์ง์์ด ๋ง์ด ์ฌ์ฉ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ด ๋ฐ๋๋ ๋ชจ๋ ์ธ์ด์ ๋ชจ๋ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ํ ๋ก ์์ ์ ๊ธฐ๋ฉ๋๋ค. ๋ณ๋ก ๋์์ด ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ด Go์ ์ผํญ ์ฐ์ฐ์๊ฐ ์๋ ์ด์ ๊ฐ ์ ๋ถ๊ฐ ์๋๋๊น?
์ด๊ฒ์ด Go์ ์ผํญ ์ฐ์ฐ์๊ฐ ์๋ ์ด์ ๊ฐ ์ ๋ถ๊ฐ ์๋๋๊น?
์๋์. "์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ๋จ์ฉ๋ ์ ์์ต๋๋ค"์ "์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ฉ๋๋ ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ"์ ๊ตฌ๋ณํ ์ ์๊ณ ๊ตฌ๋ณํด์ผ ํฉ๋๋ค.
C์ ๋ํ ๊ฒฝํ์ด ์์ฌํ๋ ๋ฐ๋ ๋ฌด์์ ๋๊น? : ์ ํํ ๋ ๋ฒ์งธ ๋ฒ์ฃผ์ ์ํฉ๋๋ค. (์ต์ ๋ฐ ์ต๋๋ฅผ ์ ์ธํ๊ณ ๋ ?๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณธ ์ ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด๋ if ๋ฌธ์ ๋์ ์ฌ์ฉํ๋๋ก ๋ค์ ์์ฑํ์ฌ ๊ฐ์ ๋์ง ์์์ต๋๋ค. ํ์ง๋ง ์ด ๋จ๋ฝ์ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค.)
ํต์ฌ๋ก
์ด ํ ๋ก ์์๋ ์ ์์์ ๋์ผํ ์๋ฏธ๋ฅผ ์์ฑํ๊ธฐ ์ํ 6๊ฐ์ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์๋ณํ์ต๋๋ค.
f := try(os.Open(file))
, ์ ์์(๋ด์ฅ ํจ์)f := try os.Open(file)
, ํค์๋ ์ฌ์ฉ (์ ๋์ด ํค์๋)f := os.Open(file)?
, Rust(ํธ์ถ ์ ๋ฏธ์ฌ ์ฐ์ฐ์)์์์ ๊ฐ์ดf := os.Open?(file)
, @rogpeppe ์ ์ (ํธ์ถ ์ค์ ์ฐ์ฐ์)try f := os.Open(file)
, @thepudds์์ ์ ์ํจ (try ๋ฌธ)try ( f := os.Open(file); f.Close() )
, @bakul์ด ์ ์ํจ (๋ธ๋ก ์๋)(์๋ ์ด์ผ๊ธฐ๊ฐ ํ๋ ธ๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค!)
์ด๋ค ๋ชจ๋ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ, ์ข์ ์ ์ ๋ชจ๋ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์คํ์ ์ํด ๋ค์ํ ๊ตฌ๋ฌธ ์ค์์ ์ ํํ๋ ๊ฒ์ด ๊ทธ๋ค์ง ์ค์ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
@brynbellomy์ ์๊ฐ์ ์๊ทนํ๋ ์ด ์๋ฅผ ์ฐพ์์ต๋๋ค.
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// vs
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
๋ฌผ๋ก ์ด๋ฌํ ๊ตฌ์ฒด์ ์ธ ์ ์ฌ์ด์๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ค์ ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ค์ ๋ง์ถ๊ฑฐ๋ ์ ์ธํ์ง ์๊ฒ ์ต๋๊น? ๋ ๊นจ๋ํ์ง ์์ต๋๊น? ์ ๋ ์ด๊ฒ ๊ถ๊ธํ์ต๋๋ค.
๊ทธ๋ฌ๋ @ianlancetaylor๊ฐ ๊ด์ฐฐํ ๊ฒ์ฒ๋ผ โ์๋๋ ์ฃผ๋๊ถ์ ๋ฌป์ต๋๋ค. ์ฝ๋๋ ์ผ๋ จ์ try ๋ฌธ์ด ๋์ด ์ฝ๋๊ฐ ์ค์ ๋ก ํ๋ ์ผ์ ๋ชจํธํ๊ฒ ๋ง๋ญ๋๋ค."
๋๋ ๊ทธ๊ฒ์ด ์ค์ํ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ์๋๋ฅผ ์ ๋ ฌํ๊ฑฐ๋ ๋ธ๋ก์์์ ๊ฐ์ด ์ธ์ ๋ถํดํ๋ ๊ฒ์ ์๋ชป๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ์ง์ ์์ ์ค์ํ ๊ฒ์ ๋ชจ๋ ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ด ์๋๋ฉฐ ์ฝ์ ๋ ์ง์คํด์ผ ํ๋ ๊ฒ๋ ์๋๋๋ค.
AsCommit์ ๊ฒฐ์ฝ ์คํจํ์ง ์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋๋ค๋ ์ฃผ์ฅ์ ์ํด ๊ฐ์ ํฉ๋๋ค. ์ด์ ๋ค์์ด ์์ต๋๋ค.
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// vs
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
์ธ๋ป ๋ณด๋ฉด ๊ฐ์ด๋ฐ ๋ ์ค์ด ๋ค๋ฅธ ์ค๊ณผ ํ์ฐํ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์์? ์ค๋ฅ ์ฒ๋ฆฌ ๋๋ฌธ์ ๋ํ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ด ์ฝ๋์ ๋ํ ๊ฐ์ฅ ์ค์ํ ์ธ๋ถ ์ฌํญ์ด๋ฉฐ, ์ฒซ๋์ ์์์ฐจ๋ ค์ผ ํ๋ ๊ฒ์ ๋๊น? ๋ด ๋๋ต์ ์๋์ค์ ๋๋ค. ํ๋ก๊ทธ๋จ์ด ๋จผ์ ์ํํ๋ ์์ ์ ํต์ฌ ๋ ผ๋ฆฌ์ ๋์ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์์ฐจ๋ ค์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์์์ try ๋ฌธ๊ณผ try ๋ธ๋ก์ ํต์ฌ ๋ ผ๋ฆฌ์ ๊ด์ ์ ๋ฐฉํดํฉ๋๋ค. ๋์๊ฒ ์ด๊ฒ์ ์ด๋ฌํ ์๋ฏธ๋ก ์ ๋ํ ์ฌ๋ฐ๋ฅธ ๊ตฌ๋ฌธ์ด ์๋์ ์์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฒ์ 4๊ฐ์ ๊ตฌ๋ฌธ์ด ๋จ๊ฒ ๋๋ฉฐ, ์ด๋ ์๋ก ํจ์ฌ ๋ ์ ์ฌํฉ๋๋ค.
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
headRef := try r.Head()
parentObjOne := try headRef.Peel(git.ObjectCommit)
parentObjTwo := try remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try index.WriteTree()
tree := try r.LookupTree(treeOid)
// vs
headRef := r.Head()?
parentObjOne := headRef.Peel(git.ObjectCommit)?
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)?
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()?
tree := r.LookupTree(treeOid)?
// vs
headRef := r.Head?()
parentObjOne := headRef.Peel?(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel?(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree?()
tree := r.LookupTree?(treeOid)
๋ค๋ฅธ ๊ฒ๋ณด๋ค ํ๋๋ฅผ ์ ํํ๋ ๋ฐ ๋๋ฌด ์ด์คํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ค ๋ชจ๋๋ ์ข์ ์ ๊ณผ ๋์ ์ ์ด ์์ต๋๋ค. ๋ด์ฅ ํ์์ ๊ฐ์ฅ ์ค์ํ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(1) ์ ํํ ํผ์ฐ์ฐ์๋ ํนํ ์ ๋์ฌ try x.y().z()
์ ๋น๊ตํ ๋ ๋งค์ฐ ๋ช
ํํฉ๋๋ค.
(2) try์ ๋ํด ์ ํ์๊ฐ ์๋ ๋๊ตฌ๋ ์ด๋ฅผ ์ผ๋ฐ ํจ์ ํธ์ถ๋ก ์ทจ๊ธํ ์ ์์ผ๋ฏ๋ก ์๋ฅผ ๋ค์ด goimports๋ ์กฐ์ ์์ด ์ ์๋ํฉ๋๋ค.
(3) ํฅํ ํ์ฅ ๋ฐ ํ์ํ ๊ฒฝ์ฐ ์กฐ์ ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ค์ ์ฝ๋๋ฅผ ๋ณธ ํ์๋ ๋ค๋ฅธ ์ธ ๊ฐ์ง ๊ตฌ๋ฌธ ์ค ํ๋์ ์ฅ์ ์ด ํจ์ ํธ์ถ ๊ตฌ๋ฌธ์ ์ด๋ฌํ ์ฅ์ ๋ณด๋ค ๋ ํฐ์ง ์ฌ๋ถ๋ฅผ ๋ ์ ์ดํดํ ์ ์์ ๊ฒ์ ๋๋ค. ์คํ๊ณผ ๊ฒฝํ๋ง์ด ์ฐ๋ฆฌ์๊ฒ ์ด๊ฒ์ ๋งํด ์ค ์ ์์ต๋๋ค.
๋ชจ๋ ์ค๋ช ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์๊ฐํ ์๋ก ์ ์์ด ๋ง์์ ๋ค๊ณ ๋ชฉํ์ ์ด๋ป๊ฒ ๋ถํฉํ๋์ง ํ์ธํฉ๋๋ค.
err
recover()
์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๋ ์ผ๊ด์ฑ ์๊ณ ๊ตฌํํ๊ธฐ ๋ ์ฌ์ธ ๊ฒ์
๋๋ค.
func f() error {
defer func() {
if err:=error();err!=nil {
...
}
}()
}
ํธ์ง : ๋๋ ๋ช ๋ช ๋ ๋ฐํ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๊ฒ์ ์ํด ๋ช ๋ช ๋ ๋ฐํ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ด์ํ ๊ฒ์ ๋๋ค.
@flibustenet , ๋ช ๊ฐ์ง ์ ์ฌํ ์ ์์ ๋ํด์๋ https://swtch.com/try.html#named ๋ ์ฐธ์กฐํ์ญ์์ค.
(๋ชจ๋์ ๋ตํ๊ธฐ: ๊ทธ๋ ๊ฒ ํ ์๋ ์์ง๋ง ์ด๋ฆ์ด ์ง์ ๋ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง๋ฉด ๊ผญ ํ์ํ ๊ฒ์ ์๋๋ฏ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค๊ณ ๊ฒฐ์ ํ๊ธฐ ์ ์ ๊ธฐ์กด ๊ฐ๋
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
try()
์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ ๋จ์ผ ํ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ป๊ธฐ ์ํด ํ๋ก์ ํธ๊ฐ _go fmt_ ํฌ๊ธฐํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ๋น์ฉ ์์ด try()
์ ๊ฑฐ์ ๋ชจ๋ ์ด์ ์ด ์์ต๋๋ค. ๋๋ ๋ช ๋
๋์ ๊ทธ๋ ๊ฒ ํ์ต๋๋ค. ์ ์๋ํ๋ค.
๊ทธ๋ฌ๋ ํจํค์ง์ ๋ํ ์ตํ ์๋จ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ํ์๋ก ํ๋ ๋ชจ๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ try()
๊ฐ ์๋๋๋ค.
@networkimprov , ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํ๋ Go ์ฌ์ฉ์์ ๋ค๋ฅธ ์์น์์ ์ค๋ ๊ฒ ๊ฐ์ผ๋ฉฐ, ๋น์ ์ ๋ฉ์์ง๊ฐ ๋น์ ์ ๊ด์ ์ ๋ ์ ์ดํดํ ์ ์๋๋ก ์ถ๊ฐ์ ์ธ ์ธ๋ถ ์ฌํญ์ด๋ ๋งํฌ๋ฅผ ํฌํจํ๋ค๋ฉด ๋ํ์ ๋ ๊ธฐ์ฌํ ๊ฒ์ ๋๋ค.
์๋์ "๋น์ฉ"์ด ์ผ๋ง์ธ์ง๋ ํ์คํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ gofmt๋ฅผ ํฌ๊ธฐํ๋ ๊ฒ์ ์๋ ๋น์ฉ์ด "์๋ฌด๊ฒ๋ ์๋ค"(๋ฌด์์ด๋ ๊ฐ์)๋ผ๊ณ ๋งํ๋ฉด์ gofmt์ ํ์์ด goimports์ ๊ฐ์ด Go ์์ค ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ํ์์ด๋ผ๋ ๊ฒ์ ๋ฌด์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค(์: gorename). , ๋ฑ๋ฑ. ์ด๋ฌํ ๋์ฐ๋ฏธ๋ฅผ ํฌ๊ธฐํ๊ฑฐ๋ ์ ์ด๋ ํธ์ถํ ๋ ์ฝ๋์ ๋ํ ์๋นํ ๋ถ์์ ํธ์ง์ ์ฐธ๋ ๋๊ฐ๋ก go fmt๋ฅผ ํฌ๊ธฐํฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ ๋๋ค๋ฉด ๊ทธ๊ฒ์ ์ข์ ๊ฒ์ ๋๋ค. ์ด์จ๋ ๊ณ์ ๊ทธ๋ ๊ฒ ํ์ญ์์ค.
๋ํ "ํจํค์ง์ ๋ํ ์ตํ ์๋จ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ์ ์"๊ฐ ์๋ฏธํ๋ ๋ฐ ๋๋ ํ ๋ฒ์ ๋จ์ผ ๊ธฐ๋ฅ ๋์ ์ ์ฒด ํจํค์ง์ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ฑ ์ ์ ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ์ด์ ๋ ๋ถ๋ช ํํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์์ ์ํํ๋ ค๋ ์ฃผ์ ์์ ์ด ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ผ๋ฉด ์ ์ฒด ํจํค์ง์์ ๋์ผํ ์ปจํ ์คํธ๊ฐ ์ ์ ํ์ง ์์ ๊ฒ์ ๋๋ค.
@rsc , ๋ณด์
จ๊ฒ ์ง๋ง try ๋ธ๋ก ๊ตฌ๋ฌธ์ ์ ์ํ์ง๋ง ๋์ค์ ์ด ๊ธฐ๋ฅ์ ๋ํด "์๋์ค" ์ชฝ์ผ๋ก ๋๋์๊ฐ์ต๋๋ค. ๋ถ๋ถ์ ์ผ๋ก๋ ๋ช
๋ น๋ฌธ ๋๋ ํจ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ํ๋ ์ด์์ ์กฐ๊ฑด๋ถ ์ค๋ฅ ๋ฐํ์ ์จ๊ธฐ๋ ๊ฒ์ด ๋ถํธํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. try ๋ธ๋ก ์ ์์์ try
๊ฐ ํ์ํ์ง ์์ ๋ช
๋ น๋ฌธ์ ๋ช
์์ ์ผ๋ก ํ์ฉํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ง๋ง try ๋ธ๋ก ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
์ด๊ฒ์ ๋จ์ํ try ๋ธ๋ก ๋ด ์์ ๋ฐํ๋ ๋ชจ๋ ์ค๋ฅ๊ฐ ํธ์ถ์์๊ฒ ๋ฐํ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ปจํธ๋กค์ด try ๋ธ๋ก์ ํต๊ณผํ๋ฉด ๋ธ๋ก์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์ ๋๋ค.
๋น์ ์ ๋งํ๋ค
ํ๋ก๊ทธ๋จ์ด ๋จผ์ ์ํํ๋ ์์ ์ ํต์ฌ ๋ ผ๋ฆฌ์ ๋์ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์์ฐจ๋ ค์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ try ๋ธ๋ก์ ์๊ฐํ ์ด์ ์ ๋๋ค! ์ ์ธ๋๋ ๊ฒ์ ํค์๋๋ฟ๋ง ์๋๋ผ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋๋ค. ์ค๋ฅ๋ฅผ ์์ฑํ ์ ์๋ N๊ฐ์ ๋ค๋ฅธ ์์น์ ๋ํด ์๊ฐํ๊ณ ์ถ์ง ์์ต๋๋ค(ํน์ ์ค๋ฅ๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ธ).
์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ฌํญ:
try(try(foo(try(bar)).fum())
์ ๊ฐ์ ํํ์์ด ํ์ฉ๋๋์ง ์ฌ๋ถ๊ฐ ๋ช
ํํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์ฌ์ฉ์ ๋์ด์ ์ฐํธ๋ฆด ์ ์์ง๋ง ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. try ๋ธ๋ก์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๊ทธ๋ฌํ ์ฌ์ฉ์ ๊ฐ์งํ๊ณ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ try ๋ธ๋ก ์์ค์ผ๋ก ์ง๋ด๊ธฐ ์ํด ๋ ์ด์ฌํ ์ผํด์ผ ํฉ๋๋ค.try
return-on-error
์ ์ ํธํฉ๋๋ค. ์ด๊ฒ์ ๋ธ๋ก ์์ค์์ ์ผํค๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค!FWIW, ๋๋ ์ฌ์ ํ ์ด๊ฒ์ด ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@rsc
[...]
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ณต์กํ๊ณ ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ์ฝ๋๊ฐ ์ ๋น์ฟผํฐ์คํ๋ ๊ฒ์ด๋ผ๋ ์ฃผ์ฅ์ ๋๋ค. @josharian ์ด ์ธ๊ธํ๋ฏ์ด ์ด๋ฏธ "Go์์ ํ์ค์ค๋ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค."
[...]headRef := try(r.Head()) parentObjOne := try(headRef.Peel(git.ObjectCommit)) parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit)) parentCommitOne := try(parentObjOne.AsCommit()) parentCommitTwo := try(parentObjTwo.AsCommit())
"๋์ ์ฝ๋"์ ๋ํ ๊ทํ์ ์ ์ฅ์ ์ค๋๋ ๋ค์ ๋ธ๋ก๊ณผ ๊ฐ์ ๋์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ ์ ์ดํดํฉ๋๋ค.
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
์ค์๋ก ์๋ชป๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ์ค์ฒฉ๋ try
ํธ์ถ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋ํ ๊ทํ์ ์๊ฐ์ ๋ฌด์์
๋๊น?
์ฒซ ๋ฒ์งธ ๋ฒ์ ์์ ์ค์ฒฉ๋ try
๋ฅผ ํ์ฉํ์ง ์์ผ๋ฉด ๋์ค์ ํ์ํ ๊ฒฝ์ฐ ์ด ์ ํ์ ์ ๊ฑฐํ ์ ์์ง๋ง ๋ฐ๋์ ๊ฒฝ์ฐ์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด ์ ์ ์ด๋ฏธ ๋ ผ์ํ์ง๋ง ๊ด๋ จ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฝ๋ ๋ณต์ก์ฑ์ ์ํ์ด ์๋ ์์ง์ผ๋ก ํ์ฅ๋์ด์ผ ํฉ๋๋ค.
try
ํํ์์ ์ค์ฒฉ ํธ์ถ์ ์ฅ๋ คํ์ฌ ์ฝ๋ ๋ณต์ก์ฑ์ ์ํ์ผ๋ก ํ์ฅํ๋๋ก ๊ถ์ฅํฉ๋๋ค. try
๋ช
๋ น๋ฌธ์ ์ฝ๋ ๋ณต์ก์ฑ์ ์ธ๋ก๋ก ํ์ฅํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
@rsc , ๊ทํ์ ์ง๋ฌธ์,
๋ง์ง๋ง ์๋จ์ ํจํค์ง ์์ค ์ฒ๋ฆฌ๊ธฐ -- ์ค๋ฅ๊ฐ ์์๋์ง ์๋ ๊ฒฝ์ฐ:
func quit(err error) {
fmt.Fprintf(os.Stderr, "quit after %s\n", err)
debug.PrintStack() // because panic(err) produces a pile of noise
os.Exit(3)
}
์ปจํ ์คํธ: os.File์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค(๋ ๊ฐ์ง ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค: #26650 & #32088).
๊ธฐ๋ณธ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ํจํค์ง ์์ค ๋ฐ์ฝ๋ ์ดํฐ์๋ ๋ฐํ์.Caller()์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ์์ฑ๋ ๊ตฌ์กฐ์ฒด์ธ caller
์ธ์๊ฐ ํ์ํฉ๋๋ค.
_go fmt_ ์ฌ์์ฑ๊ธฐ๊ฐ ๊ธฐ์กด ํ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ณํ๋ณ๋ก ํ์์ ์ง์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
try()
์ ๋น์ฉ(์ฆ, ๋จ์ )์ ์์ ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
์์งํ Go ํ์ด ๋จผ์ check/handle
(์์ ์ผ๋ก, ์ฐธ์ ํ ์์ด๋์ด)๋ฅผ ์ ์ํ ๋ค์ 3์ try()
๋ฅผ ์ ์ํ๋ค๋ ์ฌ์ค์ด ๋๋์ต๋๋ค. ๋๋ ๋น์ ์ด ์ RFP re error handling์ ๋ฐํ ํ์ง ์์๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ ๊ฒฐ๊ณผ๋ก ๋์จ ์ ์๋ค ์ค ์ผ๋ถ์ ๋ํ ์ปค๋ฎค๋ํฐ ์๊ฒฌ์ ์์งํ์ญ์์ค(#29860 ์ฐธ์กฐ). ํ์ฉํ ์ ์๋ ์งํ๊ฐ ๋ง์ด ์์ต๋๋ค!
@rsc
ํต์ฌ๋ก
์ด ํ ๋ก ์์๋ ์ ์์์ ๋์ผํ ์๋ฏธ๋ฅผ ์์ฑํ๊ธฐ ์ํ 6๊ฐ์ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์๋ณํ์ต๋๋ค.
f := try(os.Open(file))
, ์ ์์(๋ด์ฅ ํจ์)f := try os.Open(file)
, ํค์๋ ์ฌ์ฉ (์ ๋์ด ํค์๋)f := os.Open(file)?
, Rust(ํธ์ถ ์ ๋ฏธ์ฌ ์ฐ์ฐ์)์์์ ๊ฐ์ดf := os.Open?(file)
, @rogpeppe ์ ์ (ํธ์ถ ์ค์ ์ฐ์ฐ์)try f := os.Open(file)
, @thepudds์์ ์ ์ํจ (try ๋ฌธ)try ( f := os.Open(file); f.Close() )
, @bakul์ด ์ ์ํจ (๋ธ๋ก ์๋)
try {error} {optional wrap func} {optional return args in brackets}
f, err := os.Open(file)
try err wrap { a, b }
... ๊ทธ๋ฆฌ๊ณ , IMO, ์๋ฏธ๋ก ์ ์ ํ์ฑ ๋ฟ๋ง ์๋๋ผ ๊ฐ๋ ์ฑ ํฅ์(์ด์ฒด๋ฅผ ํตํด):
f, err := os.Open(file)
relay err
๋๋
f, err := os.Open(file)
relay err wrap
๋๋
f, err := os.Open(file)
relay err wrap { a, b }
๋๋
f, err := os.Open(file)
relay err { a, b }
๋๋ ๋ฆด๋ ์ด ๋ ์๋๋ฅผ ์นํธํ๋ ๊ฒ์ด ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ผ๋ก ๋ฌด์ํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์๋๊ฐ ์๋ฌด๊ฒ๋ ์๋ํ์ง ์๊ณ ์๋ฌด ๊ฒ๋ ๋์ง์ง ์๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๋ช
ํํ์ง ์๊ณ ์ํ๋ฌผ์ด ์์ต๋๋ค. relay
์ ์ฉ์ด๋ ๋ช
ํํ ์ค๋ช
์ ํ์ฉํ๊ณ ์ค๋ช
์ ํ๋ก(์ด์จ๋ ์ด๊ฒ์ด ์ ๋ถ์)์ ๊ธฐ์ด๋ฅผ ๋๊ณ ์์ต๋๋ค.
๋ช
ํํ ํ๊ธฐ ์ํด ํธ์ง:
์๋๋ ๋ค์์ ์๋ฏธํ ์ ์์ต๋๋ค. 1. ๋ฌด์ธ๊ฐ๋ฅผ ๊ฒฝํํ ๋ค์ ์ฃผ๊ด์ ์ผ๋ก ํ๋จํ๋ ๊ฒ 2. ๊ฐ๊ด์ ์ผ๋ก ํ์ธํ๋ ๊ฒ 3. ๋ฌด์ธ๊ฐ๋ฅผ ์๋ํ๋ ๊ฒ 4. ์ค๋จ๋ ์ ์๋ ์ฌ๋ฌ ์ ์ด ํ๋ฆ์ ์์ํ๊ณ ์ฐจ๋จ๋ ์ ์๋ ๊ฒฝ์ฐ ์๋ฆผ์ ์์ํ๋ ๊ฒ
์ด ์ ์์์ try๋ ๊ทธ ์ค ์๋ฌด ๊ฒ๋ ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ค์ ๋ก ๊ธฐ๋ฅ์ ์คํํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ค๋ฅ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ด ํ๋ฆ์ ๋ค์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ ๋ง ๊ทธ๋๋ก ๋ณดํธ ๊ณ์ ๊ธฐ์ ์ ์์ ๋๋ค. ํ ์คํธ๋ ์ค๋ฅ ๊ฐ์ ๋ฐ๋ผ ํ๋ก๋ฅผ ์ง์ ๋ค์ ๋ฐฐ์นํฉ๋๋ค(์ฆ, ํ์ฌ ๊ธฐ๋ฅ ๋ฒ์๋ฅผ ๋จ๋ฝ).
try ๋ธ๋ก ์ ์์์ try๊ฐ ํ์ํ์ง ์์ ๋ช ๋ น๋ฌธ์ ๋ช ์์ ์ผ๋ก ํ์ฉํ์ต๋๋ค.
Java ๋ฐ Python๊ณผ ๊ฐ์ ์ธ์ด์ try-catch ์์คํ
์ ํตํด ๋ณผ ์ ์๋ Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฃผ์ ์ด์ ์ ์ด๋ค ํจ์ ํธ์ถ์ด ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๊ณ ์ด๋ค ๊ฒ์ด ๋ฐ์ํ์ง ์์์ง ํญ์ ๋ช
ํํ๋ค๋ ๊ฒ์
๋๋ค. ์๋ ์ ์์ ๋ฌธ์ํ๋ try
์ ์ฅ์ ์ ์ด ์ค์ํ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ๊ฐ๋จํ ์ค๋ฅ ์ฒ๋ฆฌ ์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
@Goodwine ์ ์์ ์์ ๋น๋ฆฌ์๋ฉด ์ถ์ ํจ์๋ ๋ถ๊ตฌํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ ๊ด์ ์์ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
... try-catch ์ธ์ด์์ ํํ ๋ณผ ์ ์๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
parentCommitOne := r.Head().Peel(git.ObjectCommit).AsCommit()
parentCommitTwo := remoteBranch.Reference.Peel(git.ObjectCommit).AsCommit()
... ์ฝ๋์ ์ด๋ค ๋ถ๋ถ์ด ์ค๋ฅ๋ก ์ธํด ์ ์ด ํ๋ฆ์ ์ ํํ ์ ์๊ณ ์ด๋ค ๋ถ๋ถ์ด ์ ํํ ์ ์๋์ง ์ฌ์ ํ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@bakul ์ด ์ด์จ๋ ์ด ๋ธ๋ก ๊ตฌ๋ฌธ ์ ์์ ์นํธํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ๋ค๋ฅธ ๊ฒ๊ณผ ๋น๊ตํ์ฌ Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์ ์ ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Go๊ฐ ์ฑํํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ ์ฝ๋์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ถ๋ถ์ ๋๋ ํํด์๋ ์ ๋๋ค๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์์ ๋๊ตฌ๋ฅผ ์์ฑํ์ต๋๋ค. tryhard
(์ง๊ธ์ ๊ทธ๋ค์ง ๋
ธ๋ ฅํ์ง ์์)์ ํ์ผ ๋จ์๋ก ์๋ํ๊ณ ๊ฐ๋จํ AST ํจํด ์ผ์น๋ฅผ ์ฌ์ฉํ์ฌ try
์ ์ ์ฌ์ ํ๋ณด๋ฅผ ์ธ์ํฉ๋๋ค. ์ค๋ช
์ ๋ฅผ ์ฝ์ผ์ญ์์ค.
ํ ๋ณด๊ณ ์์์ $GOROOT/src
์ ์ ์ฉ > try
์ ๋ํ 5000(!) ๊ธฐํ. ๋ง์ ์คํ์ง๊ฐ ์์ ์ ์์ง๋ง ์ ์ ํ ์ํ์ ์ง์ ํ์ธํ๋ฉด ๋๋ถ๋ถ์ ๊ธฐํ๊ฐ ์ค์ ์์ ์ ์ ์์ต๋๋ค.
์ฌ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด try
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง ๋ณด์ฌ์ค๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ถ๋ ฅ๋ฌผ์ ์ผํ ๋ณด๋ฉด ์ ๋ง์์ ์๋นํ ๊ฐ์ ์ด ์์์ ์ ์ ์์ต๋๋ค.
( ์ฃผ์: ๋ค์ ์ฐ๊ธฐ ๊ธฐ๋ฅ์ ํ์ผ์ ํ๊ดดํฉ๋๋ค! ์ฌ์ฉ์ ๋ํ ์ฑ ์์ ์ฌ์ฉ์์๊ฒ ์์ต๋๋ค. )
์ด๊ฒ์ด try
๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ์ ํด ์ํ์ ๋น์์ฐ์ ์ธ ์ถ์ธก์ ์ง๋์น ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
"๋์ ์ฝ๋"์ ๋ํ ๊ทํ์ ์ ์ฅ์ ์ค๋๋ ๋ค์ ๋ธ๋ก๊ณผ ๊ฐ์ ๋์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ ์ ์ดํดํฉ๋๋ค.
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()) parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
๋ด ์ ์ฅ์ Go ๊ฐ๋ฐ์๊ฐ ๋ช ํํ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ผ์ ํ๋ฅญํ๊ฒ ์ํํ๋ฉฐ, ์ปดํ์ผ๋ฌ๊ฐ ๋น์ ์ด๋ ๋๋ฃ๊ฐ ๊ทธ๋ ๊ฒ ๋ณด์ด๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ ์ ์ผํ ๊ฒ์ ์๋๋ผ๋ ๊ฒ์ ๋๋ค.
์ค์๋ก ์๋ชป๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ์ค์ฒฉ๋
try
ํธ์ถ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋ํ ๊ทํ์ ์๊ฐ์ ๋ฌด์์ ๋๊น?
Go์ ๋จ์ํจ์ ์๋น ๋ถ๋ถ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑ๋๋ ์ง๊ต ๊ธฐ๋ฅ์ ์ ํ์์ ํ์๋ฉ๋๋ค. ์ ํ์ ์ถ๊ฐํ๋ฉด ์ง๊ต์ฑ, ๊ตฌ์ฑ์ฑ, ๋ ๋ฆฝ์ฑ์ด ๊นจ์ ธ ๋จ์์ฑ์ด ๊นจ์ง๋๋ค.
์ค๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ด ์์ต๋๋ค.
x := expression
y := f(x)
๋ค๋ฅธ ๊ณณ์์ x๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ฅผ ๋จ์ํํ๋ ์ ํจํ ํ๋ก๊ทธ๋จ ๋ณํ์ ๋๋ค.
y := f(expression)
try ํํ์์ ์ ํ์ ์ ์ฉํ๋ฉด ์ด๊ฒ์ด ํญ์ ์ ํจํ ๋ณํ์ด๋ผ๊ณ ๊ฐ์ ํ ๋ชจ๋ ๋๊ตฌ๊ฐ ์ค๋จ๋ฉ๋๋ค. ๋๋ ํํ์๊ณผ ํจ๊ป ์๋ํ๊ณ try ํํ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ํ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์์๋ฅผ ๋์ ํด์ผ ํฉ๋๋ค. ๋ฑ๋ฑ.
์์ปจ๋, ์ ํ์ ์๋นํ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ค์ "๋๊ตฐ๊ฐ ์ด ๋ฒฝ์ ๋ถ๋ชํ ์ฐ๋ฆฌ์๊ฒ ๊ทธ๊ฒ์ ๋ฌด๋๋จ๋ฆฌ๋ผ๊ณ ์๊ตฌํ๋์ง ๋ณด์"๊ฐ ์๋๋ผ ์๋นํ ์ ๋น์ฑ์ด ํ์ํฉ๋๋ค.
2๋ ์ https://github.com/golang/go/issues/18130#issuecomment -264195616(์ ํ ๋ณ์นญ์ ๋งฅ๋ฝ์์)์ ๋ ๊ธด ์ค๋ช ์ ์ผ์ต๋๋ค. ์ด๋ ์ฌ๊ธฐ์๋ ๋๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
@๋ฐ์ฟจ ,
ํ์ง๋ง ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. try ๋ธ๋ก ์ ์์์ _ํ์ํ์ง ์์_
try
๋ช ๋ น๋ฌธ์ ๋ช ์์ ์ผ๋ก ํ์ฉํ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ ๋ฒ์งธ ๋ชฉํ ์ธ "์ค๋ฅ ๊ฒ์ฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ชจ๋ ๋ช ์์ ์ผ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ฆ, ํ๋ก๊ทธ๋จ ํ ์คํธ์์ ๋ณผ ์ ์์ด์ผ ํฉ๋๋ค. ์์ธ ์ฒ๋ฆฌ์ ํจ์ ์ ๋ฐ๋ณตํ๊ณ ์ถ์ง ์์ต๋๋ค."
์ ํต์ ์ธ ์์ธ ์ฒ๋ฆฌ์ ์ฃผ์ ํจ์ ์ ๊ฒ์ฌ๊ฐ ์ด๋์ ์๋์ง ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๋๋ค. ๊ณ ๋ คํ๋ค:
try {
s = canThrowErrors()
t = cannotThrowErrors()
u = canThrowErrors() // a second call
} catch {
// how many ways can you get here?
}
ํจ์ ์ด๋ฆ์ด ๊ทธ๋ ๊ฒ ์ ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์คํจํ ์ ์๋ ํจ์์ ์ฑ๊ณตํ ์ ์๋ ํจ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฆ, ์์ธ๋ก ์ธํด ์ค๋จ๋ ์ ์๋ ์ฝ๋ ์กฐ๊ฐ๊ณผ ์ค๋จํ ์ ์๋ ๋ถ๋ถ์ ์ฝ๊ฒ ์ถ๋ก ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ Swift์ ์ ๊ทผ ๋ฐฉ์ ๊ณผ ๋น๊ตํ์ญ์์ค. ์ ํต์ ์ธ ์์ธ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ์ผ๋ถ ์ฑํํ์ง๋ง ์ค์ ๋ก๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ๊ฐ ๊ฒ์ฌ๋ ํจ์์ ๋ช ์์ ๋ง์ปค๊ฐ ์๊ณ ํ์ฌ ์คํ ํ๋ ์ ์ด์์ผ๋ก ํด์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
do {
let s = try canThrowErrors()
let t = cannotThrowErrors()
let u = try canThrowErrors() // a second call
} catch {
handle error from try above
}
๋ฌ์คํธ๋ ์ค์ํํธ๋ ์ด ์ ์์ด๋ ์์ธ ์ฒ๋ฆฌ์ ๋ํ ํต์ฌ์ ์ด๊ณ ์ค์ํ ๊ฐ์ ์ฌํญ์ ํ ์คํธ์ ๋ช ์์ ์ผ๋ก ํ์ํ๋ ๊ฒ์ ๋๋ค. ๋งค์ฐ ๊ฐ๋ฒผ์ด ๋ง์ปค๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๊ฒ์ฌ๊ฐ ์๋ ๊ฐ ์์น๋ฅผ ํ์ํฉ๋๋ค.
์์์ ๊ฒ์ฌ ๋ฌธ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ง๋ 8์ ๋ฌธ์ ๊ฐ์์ ๋ฌธ์ ์น์ , ํนํ ๋ ๊ฐ์ Raymond Chen ๊ธฐ์ฌ์ ๋ํ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
ํธ์ง: ๋ด๊ฐ ์ด ์์ ์ ํ๋ ๋์ ๋ค์ด์๋ @velovix ์ ๋๊ธ 3๋ ์ฐธ์กฐํ์ธ์.
@daved , "๋ณดํธ ๊ณ์ ๊ธฐ" ๋น์ ๊ฐ ํจ๊ณผ๊ฐ ์์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ํ๋ก๊ฐ ์๋๋๋ค.
์ด๋ค ๋จ์ด๋ผ๋ ์คํดํ ์ ์์ต๋๋ค.
"break"๋ ํ๋ก๊ทธ๋จ์ ์ค๋จํ์ง ์์ต๋๋ค.
"continue"๋ ํ์์ ๊ฐ์ด ๋ค์ ๋ฌธ์์ ์คํ์ ๊ณ์ํ์ง ์์ต๋๋ค.
"goto" ... ์ goto๋ ์ค์ ๋ก ์คํดํ ์ ์์ต๋๋ค. :-)
https://www.google.com/search?q=define+try ์ "๋ฌด์ธ๊ฐ๋ฅผ ์๋ํ๊ฑฐ๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด์ญ์์ค" ๋ฐ "์ฌํ ๋์"์ด๋ผ๊ณ ๋์ ์์ต๋๋ค. ๋ ๋ค "f := try(os.Open(file))"์ ์ ์ฉ๋ฉ๋๋ค. os.Open์ ์๋ํ๊ณ (๋๋ ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ์ํ) ์๋(๋๋ ์ค๋ฅ ๊ฒฐ๊ณผ)๊ฐ ์คํจํ๋ฉด ํจ์์์ ๋ฐํ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ง๋ 8์์ ์ํ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๊ฒ๋ ์ข์ ๋ง์ด์๋ค. ์ฐ๋ฆฌ๋ C++/Java/Python์ ์ญ์ฌ์ ์ํ๋ฌผ์๋ ๋ถ๊ตฌํ๊ณ try๋ก ์ ํํ์ต๋๋ค. ์๋ํ๋ฉด ์ด ์ ์์์ try์ ํ์ฌ ์๋ฏธ๋ Swift์ try(์ฃผ๋ณ do-catch ์ ์ธ) ๋ฐ Rust์ ์๋ try์ ์๋ฏธ์ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ๋๋ค! . ๋์ค์ ํ์ธ์ด ๊ฒฐ๊ตญ ์ฌ๋ฐ๋ฅธ ๋จ์ด๋ผ๊ณ ๊ฒฐ์ ํ๋ฉด ๋์ฐํ์ง ์๊ฒ ์ง๋ง ์ง๊ธ์ ์ด๋ฆ ์ด์ธ์ ๊ฒ์ ์ง์คํด์ผ ํฉ๋๋ค.
๋ค์์ github.com/josharian/pct
์ ํฅ๋ฏธ๋ก์ด tryhard
๊ฑฐ์ง ๋ถ์ ์
๋๋ค. ์ฌ๊ธฐ์์ ์ธ๊ธํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try
๊ฐ์ง๊ฐ ๊น๋ค๋ก์ด ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.if err != nil
์ ์๊ฐ์ ๋น์ฉ์ ์ฌ๋๋ค(์ ์ด๋ ์ )์ด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น๋ฉฐ try
๊ฐ ๋์์ด ๋ ์ ์์์ ๋ณด์ฌ์ค๋๋ค.์ ์:
var err error
switch {
case *flagCumulative:
_, err = fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s)
case *flagQuiet:
_, err = fmt.Fprintln(w, line.s)
default:
_, err = fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s)
}
if err != nil {
return err
}
์ดํ(์๋ ์ฌ์์ฑ):
switch {
case *flagCumulative:
try(fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s))
case *flagQuiet:
try(fmt.Fprintln(w, line.s))
default:
try(fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s))
}
https://golang.org/cl/182717 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: src: apply tryhard -r $GOROOT/src
std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ try
์ ๋ํ ์๊ฐ์ ์์ด๋์ด๋ฅผ ๋ณด๋ ค๋ฉด CL 182717 ๋ก ์ด๋ํ์ญ์์ค.
@josharian๋ , ๊ฐ์ฌ ํฉ๋๋ค . ์, ์ข์ ๋๊ตฌ๋ผ๋ try
์ ๋ํ ๋ชจ๋ ๊ฐ๋ฅํ ์ฌ์ฉ ํ๋ณด๋ฅผ ๊ฐ์งํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ข๊ฒ๋ ๊ทธ๊ฒ์ด (์ด ์ ์์) ์ฃผ์ ๋ชฉํ๋ ์๋๋๋ค. ๋๊ตฌ๋ฅผ ๊ฐ๋ ๊ฒ์ ์ ์ฉํ์ง๋ง ์์ง ์์ฑ๋์ง ์์ ์ฝ๋์์ try
์ ์ฃผ์ ์ด์ ์ ๋ด
๋๋ค(์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ฝ๋๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค).
"break"๋ ํ๋ก๊ทธ๋จ์ ์ค๋จํ์ง ์์ต๋๋ค.
"continue"๋ ํ์์ ๊ฐ์ด ๋ค์ ๋ฌธ์์ ์คํ์ ๊ณ์ํ์ง ์์ต๋๋ค.
"goto" ... ์ goto๋ ์ค์ ๋ก ์คํดํ ์ ์์ต๋๋ค. :-)
break
๋ ๋ฃจํ๋ฅผ ๋์ต๋๋ค. continue
๋ ๋ฃจํ๋ฅผ ๊ณ์ํ๊ณ goto
๋ ํ์๋ ๋์์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ถ๊ทน์ ์ผ๋ก, ๋๋ ๋น์ ์ ๋ง์ ๋ฃ์ต๋๋ค. ๊ทธ๋ฌ๋ ํจ์๊ฐ ๋๋ถ๋ถ ์๋ฃ๋๊ณ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง๋ง ๋กค๋ฐฑํ์ง ์์ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์๊ฐํด ๋ณด์ญ์์ค. ๊ทธ๊ฒ์ ์๋/์ํ์ด ์๋์์ต๋๋ค. ๋๋ ๊ทธ ์ ์์ check
๊ฐ ํจ์ฌ ์ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค("์ํ"์ ํตํด "์งํ์ ์ค์ง"ํ๋ ๊ฒ์ด ํ์คํ ์ ์ ํฉ๋๋ค).
๋ ๊ด๋ จํ์ฌ ๋ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ๋ฌ๋ฆฌ ๋ด๊ฐ ์ ๊ณตํ try/check ํ์์ด ๊ถ๊ธํฉ๋๋ค.
try {error} {optional wrap func} {optional return args in brackets}
f, err := os.Open(file)
try err wrap { a, b }
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค๋ฅธ ํจํค์ง๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ์ฐ๊ฒฐํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํ์ง ์๋๋ค๋ ์ ์์ "์ค์ " Go ์ฝ๋๋ฅผ ๋ํํ์ง ์์ต๋๋ค. ์์กด์ฑ ๋จน์ด ์ฌ์ฌ์ ์์์ ์๋ ํจํค์ง์ ๋นํด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฑ๋ ์ฌ์ฉ๋์ด ์ ์ ์ด์ ๋ฅผ ๊ณผ๊ฑฐ์ ์์์ฐจ๋ ธ์ต๋๋ค. ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ํ๊ฐ ์ด ์ ์์ ์ฑ๋๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ก ์ฌ๋ผ๊ฐ์๋ก ๋ ๋ง์ ๊ฒ์ ๋ฐ๊ฒฌํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ๋ ํฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋ ๊ธฐ๋ฐ์์ tryhard๋ฅผ ์คํํ๊ณ ํด๋น ์ปจํ ์คํธ์์ ์ด๋ค ์ฌ๋ฏธ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค. (ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฅ๋ฏธ๋กญ์ง๋ง ์ธ๊ณ์ ์ ํํ ์ํ๋ง๋ณด๋ค ์ถ์ํ์ ๊ฐ๊น์ต๋๋ค.)
๋ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ ๊ณตํ try/check ํ์์ด ๊ถ๊ธํฉ๋๋ค.
๋๋ ๊ทธ ํํ๊ฐ ๊ฒฐ๊ตญ ๊ธฐ์กด์ ํต์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฐฝ์กฐ ํ๋ค๊ณ ์๊ฐํ๋ค.
@networkimprov , ๋ค์ https://github.com/golang/go/issues/32437#issuecomment -502879351
์์งํ Go ํ์ด ์ฐ๋ฆฌ์๊ฒ ๋จผ์ ํ์ธ/์ฒ๋ฆฌ(์์ , ์ฐธ์ ํ ์์ด๋์ด)๋ฅผ ์ ์ํ ๋ค์, ์ผํญ์ try()๋ฅผ ์ ์ํ๋ค๋ ์ฌ์ค์ ๊ธฐ๋ถ์ด ๋์ฉ๋๋ค. ๋๋ ๋น์ ์ด ์ RFP re ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฐํํ์ง ์์๋์ง ์ ์ ์์ผ๋ฉฐ, ๊ทธ ๋ค์ ๊ฒฐ๊ณผ ์ ์ ์ค ์ผ๋ถ์ ๋ํ ์ปค๋ฎค๋ํฐ ์๊ฒฌ์ ์์งํฉ๋๋ค(#29860 ์ฐธ์กฐ). ํ์ฉํ ์ ์๋ ์งํ๊ฐ ๋ง์ด ์์ต๋๋ค!
#29860์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด ์์งํ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ ์์ฒญํ๋ ํ ์ฐ๋ฆฌ๊ฐ ํ์ด์ผ ํ๋ค๊ณ ์ ์ํ ๊ฒ๊ณผ ์ค์ ๋ก ์ํํ ๊ฒ ์ฌ์ด์ ํฐ ์ฐจ์ด๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์์ธ ์ด์ ํ์ด์ง ์๋ "๋ ผ์์ ์์์ ์ด๋ฉฐ ์ค์ ์ ์์ผ๋ก ์ ํ๋ ์ ์์ ๋งํผ ์ข์ ๋์์ธ์ ์์ฐํ๋ ์ต์ข ๋ชฉํ"๋ผ๊ณ ๋ช ์๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ ์งง์ ํผ๋๋ฐฑ์์ ์์ ํ ๋์ ์ ์์ ์ด๋ฅด๊ธฐ๊น์ง ๋ง์ ๊ฒ์ ์์ฑํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ด ๋์์ด ๋์์ผ๋ฉฐ ํนํ ์ ๋ฆฌํ๊ณ ์์ฝํ๋ ๋ฐ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅด๊ฑฐ๋ ๊ด๋ฃ์ฃผ์์ ์ถ๊ฐ ๊ณ์ธต์ ๋์ ํ๋ ๋ฐ ์ง์ฐฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ ๊ฒ์ฒ๋ผ ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ๋ ์ปค๋ฎค๋ํฐ์ ์กฐ์ธ์ ๊ตฌํ์ง ์์๊ฑฐ๋ ๋ฌด์ํ๋ค๊ณ ์ฃผ์ฅํ์ง ๋ง์ญ์์ค. ๊ทธ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค.
๋๋ ๋ํ ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌด์์ด๋ ๊ฐ์ try๊ฐ ์ด๋ค ์ ์ผ๋ก๋ "ternaryesque"์ธ์ง ์ ์ ์์ต๋๋ค.
๋์ํฉ๋๋ค. ๊ทธ๊ฒ ์ ๋ชฉํ์๋ ๊ฒ ๊ฐ์์. ๋ ๋ณต์กํ ๋ฉ์ปค๋์ฆ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๋น์ ์ ์ ์ฅ์ด๋ผ๋ฉด ๋๋ถ๋ถ์ ๋ถ๋ง์ ์นจ๋ฌต์ํค๋ ์ฝ๊ฐ์ ๊ตฌ๋ฌธ ์คํ์ ์ ์ํ๊ณ ๋ ์ด์์ ์๋๋๋ค.
@rsc , ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค!
https://github.com/golang/go/issues/32437#issuecomment -502840914์์ ํจํค์ง ์์ค ํธ๋ค๋ฌ๋ฅผ ์ฌ๋ ธ์ต๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -502879351์ ์ค๋ช
์์ฒญ์ ์๋ตํ์ต๋๋ค.
ํจํค์ง ์์ค ํธ๋ค๋ฌ๋ ๊ฑฐ์ ๋ชจ๋ ์ฌ๋์ด ๋ค์ฒ์ง ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
try {} catch{} ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ธ์. ํ ์ ๋ ๋ง๋ค์ง ๋ง์ธ์.
try {} catch{} ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ธ์. ํ ์ ๋ ๋ง๋ค์ง ๋ง์ธ์.
๋จ๋ค์ด ์ฐ๋ ๋ฐํด๊ฐ ๋ค๋ชจ๋ ๋ชจ์์ผ ๋ ๋ ์ข์ ๋ฐํด๋ฅผ ๋ง๋๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํด์.
@jimwei
์์ธ ๊ธฐ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊ธฐ์กด ํ ์ผ ์ ์์ง๋ง ์๋ ค์ง ๋ฌธ์ ๋ ๊ฝค ์์ต๋๋ค. ์๋ ์ด์ ๋์์ธ์ ๋ฌธ์ ์ค๋ช ์ ์ด๋ฌํ ๋ฌธ์ ์ ๊ฐ์๋ฅผ ํ๋ฅญํ๊ฒ ์ค๋ช ํฉ๋๋ค.
๋ด ์์ ์ ์ ์๊ฐ๋์ง ์์ ๋ ผํ์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ง์ ์ฑ๊ณต์ ์ธ ์ต์ ์ธ์ด(์ฆ, Swift, Rust ๋ฐ Go)๊ฐ ์์ธ๋ฅผ ์ฑํํ์ง ์์๋ค๋ ๊ฒ์ด ํฅ๋ฏธ๋กญ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๊ด๋ฒ์ํ ์ํํธ์จ์ด ์ปค๋ฎค๋ํฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์์ธ์ ํจ๊ป ์์ ํด์ผ ํ๋ ์๋ ํ์ ์์ธ๋ฅผ ์ฌ๊ณ ํ๊ณ ์์์ ์๋ ค์ค๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -502837008์ ๋ํ ์๋ต์ผ๋ก ( try
์ ๋ํ @rsc ์ ์๊ฒฌ์ ์ง์ ๋ก)
์ข์ ์ง์ ์ ํ์ จ์ต๋๋ค. ์ด ๋๊ธ์ ์์ฑํ๊ธฐ ์ ์ ์ด๋ป๊ฒ๋ ํด๋น ๋๊ธ์ ๋์น ์ ์ฃ์กํฉ๋๋ค. https://github.com/golang/go/issues/32437#issuecomment -502871889
try
๋ฅผ ํํ์์ผ๋ก ์ฌ์ฉํ ์์ ๋ $ try
๋ฅผ ๋ช
๋ น๋ฌธ์ผ๋ก ์ฌ์ฉํ ์์ ๋ณด๋ค ํจ์ฌ ์ข์ ๋ณด์
๋๋ค. ๋ฌธ์ด try
๋ก ์ด์ด์ง๋ค๋ ์ฌ์ค์ ์ฌ์ค ์ฝ๊ธฐ๋ฅผ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ try
ํํ์์ด ์ค์ ๋ก ๋ด ๋์ ์ด ๋์์ _์ฅ๋ คํ๋_ ๊ฒ์ฒ๋ผ ์ฌ๋๋ค์ด try ํธ์ถ์ ์ค์ฒฉํ์ฌ ๋์ ์ฝ๋๋ฅผ ๋ง๋ค๊น ๋ด ์ฌ์ ํ ๊ฑฑ์ ๋ฉ๋๋ค.
golint
๊ฐ ์ค์ฒฉ๋ try
ํธ์ถ์ ๊ธ์งํ๋ค๋ฉด ์ด ์ ์์ ์ข ๋ ๊ฐ์ฌํ๊ฒ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ํํ์ ๋ด์์ ๋ชจ๋ try
ํธ์ถ์ ๊ธ์งํ๋ ๊ฒ์ ๋๋ฌด ์๊ฒฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. try
ํํ์์ ๊ฐ๋ ๊ฒ์ ์ฅ์ ์ด ์์ต๋๋ค.
์์ ๋ฅผ ๋น๋ฆฌ๋ฉด, 2๊ฐ์ try ํธ์ถ์ ํจ๊ป ์ค์ฒฉํ๋ ๊ฒ์กฐ์ฐจ ๋งค์ฐ ๋์ฐํด ๋ณด์ ๋๋ค. Go ํ๋ก๊ทธ๋๋จธ๋ ํนํ ์ฝ๋ ๊ฒํ ์ ์์ด ์์ ํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
parentCommitOne := try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit()
parentCommitTwo := try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()
tree := try(r.LookupTree(try(index.WriteTree())))
์๋ ์์ ๋ ์ค์ ๋ก ๊ฝค ๊ด์ฐฎ์ ๋ณด์์ง๋ง ์ด ์์ ์์๋ try ํํ์์ ์ค์ฒฉํ๋ฉด(์ฌ์ง์ด 2-deep๋ง) ์ฝ๋ ๊ฐ๋
์ฑ์ด ํฌ๊ฒ ์ ํ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ค์ฒฉ๋ try
ํธ์ถ์ ๊ฑฐ๋ถํ๋ฉด "๋๋ฒ๊น
๊ฐ๋ฅ์ฑ" ๋ฌธ์ ์๋ ๋์์ด ๋ฉ๋๋ค. ํํ์ ์ธ๋ถ์ ์๋ ๊ฒฝ์ฐ try
๋ฅผ if
๋ก ํ์ฅํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ค์ ๋งํ์ง๋ง, ํ์ ํํ์ ๋ด๋ถ์ try
๋ golint
ํ๋๊ทธ๊ฐ ์ง์ ๋์ด์ผ ํ์ง๋ง ๋๋ฌด ์๊ฒฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ ๋์๋ ๊ด์ฐฎ์ต๋๋ค.
x := 5 + try(strconv.Atoi(input))
์ด๋ ๊ฒ ํ๋ฉด try
๋ฅผ ์์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ์ ๋ชจ๋ ์ป์ ์ ์์ง๋ง ๊ฐ๋ก ์ถ์ ๋๋ฌด ๋ง์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์๋ง๋ ๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ golint
์ด ๋ช
๋ น๋ฌธ๋น ์ต๋ 1๊ฐ์ try
๋ง ํ์ฉํด์ผ ํ๋ ๊ฒ์ธ๋ฐ, ์๊ฐ์ด ๋ฆ์ด์ ์ง๊ฒน๊ณ ๋ ํฉ๋ฆฌ์ ์ผ๋ก ์๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ ์ชฝ์ด๋ , ๋๋ ์ด๋ ์์ ์์ ์ด ์ ์์ ๋ํด ์๋นํ ๋ถ์ ์ ์ด์์ง๋ง, ๊ด๋ จ golint
ํ์ค์ด ์๋ ํ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ ๋ง๋ก ์ข์ํ๊ฒ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rsc
์ฐ๋ฆฌ๋ _"์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ๋จ์ฉ๋ ์ ์์ต๋๋ค"_์ "์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ฉ๋๋ ์ฝ์ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ"์ ๊ตฌ๋ณํ ์ ์๊ณ ๋ ๊ทธ๋์ผ ํฉ๋๋ค.
C์ ๋ํ ๊ฒฝํ์ด ์์ฌํ๋ ๋ฐ๋ ๋ฌด์์ ๋๊น? : ์ ํํ ๋ ๋ฒ์งธ ๋ฒ์ฃผ์ ์ํฉ๋๋ค. (์ต์์ ์ต๋๋ฅผ ์ ์ธํ๊ณ ,
try()
๋ try
์ ๋ํด ์ฒ์์ผ๋ก ๋๋ฅผ ๋๋ผ๊ฒ ํ ๊ฒ์ ์ผํญ ์ฐ์ฐ์์ ์ค์ฒฉ ๊ฐ๋ฅ์ฑ์ด ์ผ๋ง๋ ์ ์ฌํ๋ฉด์๋ try()
์ ๋ํ ์ธ์์ ์ผํญ์ ๋ํ ์ธ์๊ฐ ์ผ๋ง๋ ๋ฐ๋์ธ์ง์์ต๋๋ค. _(์์ญ):_
try():
_"์ค์ฒฉํ ์ ์์ง๋ง ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๋ด์ง ์์ฌ์ค๋ฝ์ต๋๋ค."_,์ ์คํ๊ฒ, ๋ ์ฌ์ด์ ์ฐจ์ด์ ๋ํ ํฉ๋ฆฌ์ ์ธ ์ด์ ๋ ๋๋ฌด ์ฃผ๊ด์ ์ผ๋ก ๋๊ปด์ง๋ฏ๋ก ์ฝ๊ฐ์ ๋ด์ฑ์ ์์ฒญํ๊ณ ์ต์ํ ์ ํธํ๋ ๊ธฐ๋ฅ๊ณผ ์ซ์ดํ๋ ๊ธฐ๋ฅ์ ์ฐจ์ด๋ฅผ ํฉ๋ฆฌํํ ์ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. #Please_dont_shoot_the_messenger
_"๋ด๊ฐ ?๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณธ ์ ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ด๋ ๋์ if ๋ฌธ์ ์ฌ์ฉํ๋๋ก ๋ค์ ์์ฑํ์ฌ ๊ฐ์ ๋์ง ์์์ต๋๋ค. ํ์ง๋ง ์ด ๋จ๋ฝ์ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค.)"_
๋ค๋ฅธ ์ธ์ด์์๋ ์๋ฅผ ๋ค์ด ์ค๋ PHP๋ก ์์ฑํ ์ฝ๋์์์ ๊ฐ์ด if
์์ ์ผํญ ์ฐ์ฐ์๋ก ๋ช
๋ น๋ฌธ์ ๋ค์ ์์ฑํ์ฌ ๋ช
๋ น๋ฌธ์ ์์ฃผ ๊ฐ์ ํฉ๋๋ค.
return isset( $_COOKIE[ CookieNames::CART_ID ] )
? intval( $_COOKIE[ CookieNames::CART_ID ] )
: null;
๋น๊ต ๋์:
if ( isset( $_COOKIE[ CookieNames::CART_ID ] ) ) {
return intval( $_COOKIE[ CookieNames::CART_ID ] );
} else {
return null;
}
๋ด๊ฐ ์๊ฐํ๋ ํ ์ ์๊ฐ ํ์๋ณด๋ค ํจ์ฌ ํฅ์๋์์ต๋๋ค.
์ด ์ ์์ ๋ํ ๋นํ์ ํจ์ฌ ๋ ํฌ๊ด์ ์ด์์ ์ด์ ์ ์์ ์ํด ์ ๊ธฐ๋ ๋์ ๊ธฐ๋ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฌํ ๋์ ๊ธฐ๋๋ ์ผ๊ด์ฑ ๋๋ฌธ์ ์ ๋นํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ๋ณด๊ณ ์ถ์ดํ๋ ๊ฒ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์์ ์ ์ฉํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ๋จ์ผ ๊ตฌ์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ด ๊ธฐ๋ฅ์ ๋ด์ฅ๋ append()
๊ธฐ๋ฅ๊ณผ ๋น๊ตํ์ญ์์ค. ์ถ๊ฐ๋ ์ฌ๋ผ์ด์ค์ ์ถ๊ฐ๊ฐ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ด๊ธฐ ๋๋ฌธ์ ์์ฑ๋์์ผ๋ฉฐ ์๋์ผ๋ก ์ํํ ์ ์์์ง๋ง ์๋ชป ์ํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด์ append()
๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋๊ฐ ์๋๋ผ ๋ง์ ์์ ๋๋ ์ ์ฒด ์ฌ๋ผ์ด์ค๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ []๋ฐ์ดํธ ์ฌ๋ผ์ด์ค์ ๋ฌธ์์ด์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ์ฌ๋ผ์ด์ค์ ์ถ๊ฐํ๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃฐ ๋งํผ ๊ฐ๋ ฅํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฌด๋ ๋ ์ด์ ์๋์ผ๋ก ์ฌ๋ผ์ด์ค๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ try()
๋ ๋ค๋ฆ
๋๋ค. ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฌ์ฉํ ์ ์์ ๋งํผ ๊ฐ๋ ฅํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ด ์ ์์ ๊ฐ์ฅ ์ฌ๊ฐํ ๊ฒฐํจ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. try()
๋ด์ฅ ํจ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ, ์ฆ ํธ์ถ์์๊ฒ ์ค๋ฅ๋ฅผ ์ ๋ฌํ๊ณ ์ง์ฐ ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ฉ๊ตฌ๋ฅผ ์ค์ฌ์ค๋ค๋ ์ ์์ ์ ๋ง ์ ์ฉํฉ๋๋ค. ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ ๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ์ฌ์ ํ if err != nil {}
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ ๊ฐ์ง ๊ณ ์ ํ ์คํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ์ด์ ์๋ ํ๋๋ง ์์์ต๋๋ค. ์ด ์ ์์ด Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋์์ด ๋๋ ๋ชจ๋ ๊ฒ์ด๋ผ๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ ํญ์ ํ๋ ๊ฒ์ฒ๋ผ if
๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ณ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. "์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ํ๋๋ฟ์
๋๋ค"๋ผ๋ ์ด์ ์ด ์์ต๋๋ค.
@rsc , ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค!
#32437 (์ฃผ์) ์์ ํจํค์ง ์์ค ํธ๋ค๋ฌ๋ฅผ ๋ฐ์์์ผฐ์ต๋๋ค.
#32437(๋๊ธ) ์ ์ค๋ช ์์ฒญ์ ์๋ตํ์ต๋๋ค.ํจํค์ง ์์ค ํธ๋ค๋ฌ๋ ๊ฑฐ์ ๋ชจ๋ ์ฌ๋์ด ๋ค์ฒ์ง ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํน์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋ ํจํค์ง ๊ฐ๋
์ ํจ๊ป ๋ฌถ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํจํค์ง ์์ค ํธ๋ค๋ฌ์ ๊ฐ๋
์ด net/http
์ ์ ์ฉํ๋ค๊ณ ์์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋น์ทํ ๋งฅ๋ฝ์์ ์ผ๋ฐ์ ์ผ๋ก net/http
๋ณด๋ค ์์ ํจํค์ง๋ฅผ ์์ฑํ๋๋ผ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ธฐ ์ํด ํจํค์ง ์์ค ๊ตฌ์ฑ์ ์ ํธํ๋ ๋จ์ผ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ๋ชจ๋ ์ฌ๋์ด ์์ ์ ๊ฒฝํ, ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์๊ฒฌ์ ๊ณต์ ํ๋ค๋ ๊ฐ์ ์ด ์ํํ ๊ฒ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. :)
@beoran ์ ๋ ์ด ์ ์์ด ๋ ๋์ ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. try(..., func(err) error)
๋๋ tryf(..., "context of my error: %w")
์ ๋ง์ง๋ง ์ธ์์์ ๋ฐ์ฝ๋ ์ดํฐ์ฒ๋ผ?
@flibustenet ์ด๋ฌํ ๋์ค ํ์ฅ์ด ๊ฐ๋ฅํ ์ ์์ง๋ง ํ์ฌ ์ ์์ ์ด๋ฌํ ํ์ฅ์ ๊ถ์ฅํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ถ๋ถ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ง์ฐ๊ณผ ์ค๋ณต๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ ค์ด ๋ฌธ์ ๋ def์ ๊ธฐ๋ฅ์ ๋ณต์ ํ์ง ์๊ณ ํฌ๊ด์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๋ณต์กํ ๊ฒฝ์ฐ์ ๋ ์ฝ๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก defer ๋ฌธ ์์ฒด๋ฅผ ์ด๋ป๊ฒ๋ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -502975437
๊ทธ๋ฌ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ ๊ฐ์ง ๊ณ ์ ํ ์คํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ์ด์ ์๋ ํ๋๋ง ์์์ต๋๋ค. ์ด ์ ์์ด Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋์์ด ๋๋ ์ ๋ถ๋ผ๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ
if
๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํญ์ ํ๋ ๊ฒ์ฒ๋ผ ๊ณ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ์ด๋ ์ด๊ฒ์ด ์ผ๊ด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. "์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ํ๋๋ฟ์ ๋๋ค"๋ผ๋ ์ด์ ์ด ์์ต๋๋ค.
@beoran ๋์ํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ try
ํค์๋( try
๋ฐ try
/ else
)์์ ๋๋ถ๋ถ์ ์ค๋ฅ ์ฌ๋ก๋ฅผ ํตํฉํ ๊ฒ์ ์ ์ํ ์ด์ ์
๋๋ค. try
/ else
๊ตฌ๋ฌธ์ด ๊ธฐ์กด if err != nil
์คํ์ผ์ ๋นํด ์ฝ๋ ๊ธธ์ด๋ฅผ ํฌ๊ฒ ์ค์ด์ง๋ ์์ง๋ง try
๊ณผ์ ์ผ๊ด์ฑ์ ์ ๊ณตํฉ๋๋ค. else
์์) ์ผ์ด์ค. ์ด ๋ ๊ฐ์ง ๊ฒฝ์ฐ(try ๋ฐ try-else)๋ ๋๋ถ๋ถ์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฌ๋ก๋ฅผ ๋ค๋ฃฐ ๊ฒ์
๋๋ค. ๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐํ ์ธ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค์ ๋ก ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉ๋๋ try
์ ๊ธฐ๋ณธ ์ ๊ณต๋์ง ์๋ ๋ฒ์ ์ ๋ฐ๋ํ์ฌ ๋ฃ์์ต๋๋ค(๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด ์ค๋ ๋์์ ์ธ๊ธํ๋ฏ์ด, ๋ฐ๋์ ์ฐ๋ฆฌ๊ฐ ์ฒ์๋ถํฐ ๊ถ์ฅํ๊ณ ์ถ์ ๊ฒ์ ์๋๋๋ค.)
์ผ๊ด์ฑ์ ๊ฐ๋ ์ฑ์ ์ค์ํฉ๋๋ค.
append
๋ ์ฌ๋ผ์ด์ค์ ์์๋ฅผ ์ถ๊ฐํ๋ ํ์คํ ๋ฐฉ๋ฒ์
๋๋ค. make
๋ ์๋ก์ด ์ฑ๋์ด๋ ๋งต ๋๋ ์ฌ๋ผ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ ํ์คํ ๋ฐฉ๋ฒ์
๋๋ค(๋ฆฌํฐ๋ด์ ์ ์ธ, ๋๋ ๋ณ๋ก ๊ฐํฅ์ด ์์ต๋๋ค). ๊ทธ๋ฌ๋ try()
( else
์์ด ๊ธฐ๋ณธ ์ ๊ณต๋จ)๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฃผ์ด์ง ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ๋ฟ๋ ค์ง ๊ฒ์
๋๋ค. ๋
์. ๋ค๋ฅธ ๋ด์ฅ ๊ธฐ๋ฅ(์ฆ, ๋งค์ฐ ์ด๋ ต๊ฑฐ๋ ์์ ํ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ)์ ์ ์ ์ ์๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฑ๊ณตํ try
๋ฒ์ ์ด๋ผ๋ฉด ์ผ๊ด์ฑ๊ณผ ๊ฐ๋
์ฑ ๋๋ฌธ์ ๋งต/์ฌ๋ผ์ด์ค ๋ฆฌํฐ๋ด์ ํผํ๋ ค๊ณ (๊ทธ๋ฆฌ๊ณ ์ ์ผ๋ณ์ฒ๋ผ new
๋ฅผ ํผํ๋ ค๋ ๊ฒ์ฒ๋ผ) ์ด ๋ฒ์ ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค.
์ค๋ฅ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์์ด๋์ด๋ผ๋ฉด ๊ธฐ๊ปํด์ผ "๊ฐ์ ธ๊ฐ๊ฑฐ๋ ๋จ๊ฒจ๋๋" ๋ฐฉ์์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ์ต๋ํ ๋ง์ ๊ฒฝ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ํตํฉํ๋ ๊ฒ์ด ํ๋ช ํด ๋ณด์ ๋๋ค. ํ์๊ฐ ์ค์ ๋ก ์์์ ์ค์ด๋ ๊ฒ์ด ์๋๋ผ ์ถ๊ฐํ ๊น๋ด ๋๋ ต์ต๋๋ค.
@deanveloper ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
golint๊ฐ ์ค์ฒฉ๋ try ํธ์ถ์ ๊ธ์งํ๋ค๋ฉด ์ด ์ ์์ ์กฐ๊ธ ๋ ๊ฐ์ฌํ๊ฒ ์๊ฐํฉ๋๋ค.
๊น์ด ์ค์ฒฉ๋ try
๋ ์ฝ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ try
๋ด์ฅ ํจ์๋ฟ๋ง ์๋๋ผ ํ์ค ํจ์ ํธ์ถ์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ฐ๋ผ์ golint
๊ฐ ์ด๊ฒ์ ๊ธ์งํด์ผ ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@brynbellomy ๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
try/else ๊ตฌ๋ฌธ์ด ๊ธฐ์กด if err != nil ์คํ์ผ๊ณผ ๋น๊ตํ์ฌ ์ฝ๋ ๊ธธ์ด๋ฅผ ํฌ๊ฒ ์ค์ด์ง๋ ์์ง๋ง try(๋ค๋ฅธ ์์) ๊ฒฝ์ฐ์ ์ผ๊ด์ฑ์ ์ ๊ณตํฉ๋๋ค.
try
๋ด์ฅ ํจ์์ ๊ณ ์ ํ ๋ชฉํ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ฏ๋ก "์ฐ๋ฆฌ์๊ฒ ์๋นํ ๊ฐ์๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๋ ๊ฒ์ ์ธ์ ํ ๋ ์ ์ํ try/else ๊ตฌ๋ฌธ์ ์ฑํํด์ผ ํ๋ ์ด์ ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ฝ๋ ๊ธธ์ด".
๋ํ ์ ์ํ ๊ตฌ๋ฌธ์ด try/else ์ผ์ด์ค์ ์ผ์นํ๋ try ์ผ์ด์ค๋ฅผ ๋ง๋ ๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฏธ if/else๊ฐ ์๋ ๊ฒฝ์ฐ ๋ถ๊ธฐํ๋ ์ผ๊ด์ฑ ์๋ ๋ฐฉ๋ฒ๋ ์์ฑํฉ๋๋ค. ํน์ ์ฌ์ฉ ์ฌ๋ก์์ ์ฝ๊ฐ์ ์ผ๊ด์ฑ์ ์ป์ง๋ง ๋๋จธ์ง์์๋ ๋ง์ ๋ถ์ผ์น๋ฅผ ์์ต๋๋ค.
๋๋ ๊ทธ๋ค์ด ๊ฐ์น ์๋ ๊ฒ์ ๋ํด ๋ด ์๊ฒฌ์ ํํํ ํ์๋ฅผ ๋๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ํ๋ฌธ์ ์ด๊ณ ๊ธฐ์ ์ ์ธ ๊ฒ์ ์๋์ง๋ง ๋งํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด ๋ณ๊ฒฝ์ด ์์ง๋์ด๋ง์ ์ํด ์์ง๋์ด๋ง์ด ์ํ๋๊ณ ์ ๋นํ๋ฅผ ์ํด "์งํ"์ด ์ฌ์ฉ๋๋ ์ด๋ฌํ ๊ฒฝ์ฐ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊นจ์ง์ง ์์์ผ๋ฉฐ ์ด ์ ์์ ๋ด๊ฐ Go์ ๋ํด ์ข์ํ๋ ๋ง์ ๋์์ธ ์ฒ ํ์ ์๋ฐํฉ๋๋ค.
ํ๊ธฐ ์ฝ์ง ์์ ์ผ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋์ญ์์ค.
์ด ์ ์์ ์ ํ์ฑ๋ณด๋ค ๊ฒ์ผ๋ฆ์ ๋ํ ์ต์ ํ๋ฅผ ์ ํํฉ๋๋ค. ์ด์ ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ์์ผ๋ฉฐ ๊ทธ ๋๊ฐ๋ก ์์ฒญ๋ ์์ ๊ฐ๋
์ฑ์ด ์์ค๋๊ณ ์์ต๋๋ค. ๊ฐ๋
์ฑ ๋ฐ ๋๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ์ด ํฅ์๋๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ฐ๋ ์ง๋ฃจํ ํน์ฑ์ ์์ฉํ ์ ์์ต๋๋ค.
๋ฐํ ์ธ์์ ์ด๋ฆ ์ง์ ํผํ๊ธฐ
defer
๋ช
๋ น๋ฌธ์๋ ๋ฐํ ์ธ์์ ์ด๋ฆ ์ง์ ์ด ์ ํจํ ๋ช ๊ฐ์ง ์์ธ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด ์ธ์๋ ํผํด์ผ ํฉ๋๋ค. ์ด ์ ์์ ๋ช
๋ช
๋ฐํ ์ธ์์ ์ฌ์ฉ์ ์ด์งํฉ๋๋ค. ์ด๊ฒ์ Go ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
์บก์ํ๋ ์ ๋์ ์ผ๋ก ์ ํํ ์๋ก์ด ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ด ์ ๊ตฌ๋ฌธ์๋ ์ ๋ฐ๋๊ฐ ์์ต๋๋ค. ์ค๋ฅ ๋ณ์์ ๋ฐํ์ ์จ๊ธฐ๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค. ์ฌ์ค, ๊ตฌ๋ฌธ์ ์ค๋๋ Go์์ ์ํํ๋ ๋ชจ๋ ์์
๊ณผ ๋งค์ฐ ๋ฏ์ค๊ฒ ๋๊ปด์ง๋๋ค. ๋๊ตฐ๊ฐ ๋น์ทํ ๊ธฐ๋ฅ์ ์์ฑํ๋ค๋ฉด ์ปค๋ฎค๋ํฐ์์ ์ถ์ํ๊ฐ ๋น์ฉ์ ์จ๊ธฐ๊ณ ์ ๊ณตํ๋ ค๋ ๋จ์ํจ์ ๊ฐ์น๊ฐ ์๋ค๋ ๋ฐ ๋์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋๊ตฌ๋ฅผ ๋์ฐ๋ ค๊ณ ํฉ๋๊น?
์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ์๋ฅผ ํ์ฌ ์ธ์ด์์ Go๋ก ์ ์ธํ๊ธฐ ์ํ ์๋๋ก ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๋ ๊ฒ์ด ์ฐ๋ ค๋ฉ๋๋ค. ๋จ์ํ ์ซ์๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์ธ์ด ๋ณ๊ฒฝ์ ๊ตฌํํ๋ ๊ฒ์ ๋์ ์ ๋ก๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์ง๋ฌธ์ ํ๊ณ ํด๊ฒฐ์ ์๋ํ๋ ๋น์ฆ๋์ค ๋ฌธ์ ์ ๋ฌ์ฑํ๋ ค๋ ์์ ์ด์ต์ ๋ํ ๋ต๋ณ์ ์ป๋ ๊ฒ์ด ๊ณต์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ง๊ธ ์ฌ๋ฌ ๋ฒ ๋ณธ ์ ์ด ์๋ค. ์ธ์ด ํ์ ๋ชจ๋ ์ต๊ทผ ํ๋์ผ๋ก ์ด ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ๋์์ต๋๋ค. ๊ตฌํ ์์ฒด์ ๋ํ ์ค์ ๋ ผ์๋ณด๋ค ๊ตฌํ์ ๋ํ ์นํธ๊ฐ ๋ ๋ง์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ 13์ผ ์ ์ ์์๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ณ๊ฒฝ์ด Go์ ์ธ์ด, ์ปค๋ฎค๋ํฐ ๋ฐ ๋ฏธ๋์ ๋ฏธ์น๋ ์ํฅ์ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค.
Go์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊นจ์ง์ง ์์์ผ๋ฉฐ ์ด ์ ์์ ๋ด๊ฐ Go์ ๋ํด ์ข์ํ๋ ๋ง์ ๋์์ธ ์ฒ ํ์ ์๋ฐํฉ๋๋ค.
Bill์ ๋ด ์๊ฐ์ ์๋ฒฝํ๊ฒ ํํํฉ๋๋ค.
try
์ด ์๊ฐ๋๋ ๊ฒ์ ๋ง์ ์๋ ์์ง๋ง, ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ์ง์ ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ฐ๋ฅด์น์ง ์์ ๊ฒ์ด๋ฉฐ, ๋ด๊ฐ ๋ฆฌ๋ทฐํ๋ PR์์ ๊ทธ๊ฒ์ ๋ฐ์๋ค์ด์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ๋จ์ํ ๋ค๋ฅธ '๋ด๊ฐ ์ ๋ ์ฌ์ฉํ์ง ์๋ Go์ ๊ฒ๋ค' ๋ชฉ๋ก์ ์ถ๊ฐ๋ ๊ฒ์
๋๋ค(์์ธํ ๋ด์ฉ์ YouTube์์ Mat Ryer์ ์ฌ๋ฏธ์๋ ์ด์ผ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค).
@ardan-bkennedy, ๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
"ํด๊ฒฐํ๋ ค๋ ๋น์ฆ๋์ค ๋ฌธ์ "์ ๋ํด ์ง๋ฌธํ์ จ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ "Go ํ๋ก๊ทธ๋๋ฐ"์ ์ ์ธํ๊ณ ๋ ํน์ ๋น์ฆ๋์ค์ ๋ฌธ์ ๋ฅผ ๋ชฉํ๋ก ์ผ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ง๋ 8์ Gophercon ์ค๊ณ ์ด์ ํ ๋ก ์์์์ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ฅผ ๋ถ๋ช ํ ํ์ต๋๋ค( ๋ฌธ์ ๊ฐ์ , ํนํ ๋ชฉํ ์น์ ์ฐธ์กฐ). ์ด ๋ํ๊ฐ ์ง๋ 8์๋ถํฐ ๊ณ์๋๊ณ ์๋ค๋ ์ฌ์ค ๋ํ "์ด ๋ชจ๋ ๊ฒ์ด 13์ผ ์ ์ ์์๋์๋ค"๋ ๊ทํ์ ์ฃผ์ฅ๊ณผ ์์ ํ ๋ชจ์๋ฉ๋๋ค.
์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋๊ฑฐ๋ ํด๊ฒฐํ ๊ฐ์น๊ฐ ์๋ ๋ฌธ์ ๋ผ๊ณ ์ ์ํ ์ ์ผํ ์ฌ๋์ ์๋๋๋ค. ๊ทธ๋ฌํ ๋ค๋ฅธ ์๊ฒฌ์ https://swtch.com/try.html#nonissue ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๊ธฐ๋กํ๊ณ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ์์๋ด๋ ๋ฐฉ๋ฒ์ ์ผ๋ถ๋ ์ค์ ์ฝ๋ ๊ธฐ๋ฐ์์ ์ ์์ ํ๊ฐํ๋ ๊ฒ์ ๋๋ค. Robert's tryhard์ ๊ฐ์ ๋๊ตฌ๊ฐ ์ด๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์์ ์ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋ฌด์์ ์ฐพ๋์ง ์๋ ค๋ฌ๋ผ๊ณ ์ด์ ์ ์์ฒญํ์ต๋๋ค. ๊ทธ ์ ๋ณด๋ ๋ณ๊ฒฝ์ด ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๊ฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋น์ ์ ํ๋์ ์ถ์ธก์ ํ๊ณ ๋๋ ๋ค๋ฅธ ์ถ์ธก์ ํฉ๋๋ค. ๊ด์ฐฎ์ต๋๋ค. ๋ต์ ์ด๋ฌํ ์ถ์ธก์ ๋ฐ์ดํฐ๋ก ๋์ฒดํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ์กฐ์น๋ฅผ ์ทจํ ๊ฒ์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง ์์ผ๋ก ๋์๊ฐ ๊ธธ์ ์ฅ ๋ฐ์์ด ์๋๋ผ ์คํ ๋ฐ์ดํฐ์ ๋๋ค. ๋ถํํ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋ฐ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค. ์ด ์์ ์์ ๋๋ ๋์์ ์ฃผ๊ณ ์ ํ๋ ์ฌ๋๋ค์ด ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋๋ก ๊ฒฉ๋ คํ๊ณ ์ถ์ต๋๋ค.
@ardan-bkennedy, ๋ ๋ฒ์งธ ํ์ ์กฐ์น๋ฅผ ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํ์ง๋ง ๋ค์๊ณผ ๊ด๋ จํ์ฌ:
์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ์๋ฅผ ํ์ฌ ์ธ์ด์์ Go๋ก ์ ์ธํ๊ธฐ ์ํ ์๋๋ก ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๋ ๊ฒ์ด ์ฐ๋ ค๋ฉ๋๋ค. ๋จ์ํ ์ซ์๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ์ธ์ด ๋ณ๊ฒฝ์ ๊ตฌํํ๋ ๊ฒ์ ๋์ ์ ๋ก๋ฅผ ๋ง๋ญ๋๋ค.
์ด ์ ์๋ ๋ด๊ฐ ์ง๋๊ฐ ์ ์๋ ๋ ๊ฐ์ง ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฒซ์งธ, ๋๋ Go๋ฅผ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๊ฑฐ๋ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ ๊ฐ๋ฐ์ ํด๋์ค(์ด ๊ฒฝ์ฐ "์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ์")๊ฐ ์๋ค๋ ์๋ฌต์ ์ธ ์ฃผ์ฅ์ ๊ฑฐ๋ถํฉ๋๋ค. "์ํฐํ๋ผ์ด์ฆ"์ ํน์ ์ฌ๋ก์์ ์ฐ๋ฆฌ๋ Go๋ฅผ ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ค์๊ธฐ์ ๊ณผ ๋๊ธฐ์ ์ ๋ง์ ์๋ฅผ ๋ณด๊ณ ์์ต๋๋ค.
๋์งธ, Go ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ถํฐ Robert, Rob, Ken, Ian, ๊ทธ๋ฆฌ๊ณ ์ ๋ ๋ง์ ์์คํ ์ ๊ตฌ์ถํ ๊ณต๋ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ด ๋ณ๊ฒฝ ๋ฐ ๊ธฐ๋ฅ์ ํ๊ฐํ์ต๋๋ค. ์ฐ๋ฆฌ๋ "์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์์ ์ ์๋ํ ๊น์?"๋ผ๊ณ ๋ฌป์ต๋๋ค. ๊ทธ๊ฒ์ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉํ ์ ์๋ ์ฑ๊ณต์ ์ธ ๋ ์ํผ์์ผ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๊ณ์ ์ฌ์ฉํ ๊ณํ์ด๋ฉฐ ์ด์ ์๊ฒฌ ๋ฐ ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๊ฒฝํ ๋ณด๊ณ ์์์ ์์ฒญํ ๋ฐ์ดํฐ๋ก ๋ค์ ํ ๋ฒ ์ฆ๋๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๊ฑฐ๋ Go์ ์ ํฉํ์ง ์๋ค๊ณ ์๊ฐํ๋ ์ธ์ด ๋ณ๊ฒฝ์ ์ ์ํ๊ฑฐ๋ ์ง์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ ๋ง์ Go ํ๋ก๊ทธ๋๋จธ๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ๋์ ๋ณ๊ฒฝ์ ์ ์ํ๊ฑฐ๋ ์ง์ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ Go๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@rsc
์ด๋ฌํ ํธ์๋ฅผ ์ ๊ณตํ ์ ์๋ ์์น๋ ๋ถ์กฑํ์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ ์ธํ๊ณ ๋ฉ์ปค๋์ฆ์ ์ค์ฒด๋ฅผ ์ฆ๋ช
ํ ์ด๋ค ์ฒ๋๊ฐ ์ถ๊ตฌ๋๊ณ ์์ต๋๊น? ๋ถ๋ฅ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฌ๋ก ๋ชฉ๋ก์ด ์์ต๋๊น? ๋ง์ ๊ณต๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ ์ํด ์ข์ฐ๋ ๋ ๋ฐ์ดํฐ์์ ๊ฐ์น๊ฐ ์ด๋ป๊ฒ ๋์ถ๋ ๊น์?
tryhard
๋๊ตฌ๋ ๋งค์ฐ ์ ์ตํฉ๋๋ค!
๋ด๊ฐ ์์ฃผ return ...,err
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์์ง๋ง ๋๋ถ๋ถ http ์ฒ๋ฆฌ๊ธฐ์์ ์ด๋ฏธ ์ค๋ฅ๋ฅผ ๋ํํ๋ ํจ์( pkg/errors
ํฌํจ)๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ์๊ณ ์์ ๋๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ ์ ์ฝ๋ ์ค๋ก ๊ฐ๋
์ฑ์์ ์น๋ฆฌํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ด http ํธ๋ค๋ฌ์์ defer fmt.HandleErrorf(&err, "handler xyz")
๋ฅผ ์ถ๊ฐํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ด์ ๋ณด๋ค ๋ ๋ง์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋๋ ๋ํ fmt.Printf
์ค๋ฅ๋ฅผ ์ ํ ์ ๊ฒฝ์ฐ์ง ์๊ณ try
๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ด
๋๋ค.
์๋ฅผ ๋ค์ด defer try(f.Close())
์ ํ ์ ์์ต๋๊น?
๋ฐ๋ผ์ try
๋ ๋ง์นจ๋ด ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ ๋ฐ๋๊ฐ ์๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํธ์ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
๋๋ ์ง์ง๋ก ์ํํ๊ธฐ ์ํ์ฌ ์์ฃผ ์กฐ๊ธํ๋ค!
@flibustenet ์ด ์ ์์ defer try(f())
๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค( ์ด์ ์ฐธ์กฐ). ๋ชจ๋ ์ข
๋ฅ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด tryhard
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฒ ์ด์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณผ ๋ ์ ํ์ if err != nil
๋น์จ์ ๋น๊ตํ์ฌ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ค์ ์ ๋ฌํ๋ ๊ฒ์ด ๋ ์ผ๋ฐ์ ์ธ์ง ํ์ธํ ์ ์์ต๋๊น?
๋ด ์๊ฐ์ ๊ฐ์์ ๊ฑฐ๋ํ ํ๋ก์ ํธ๋ try()
๊ฐ ์ถ๊ฐ๋ 1000๊ฐ์ ์ฅ์๋ฅผ ๋ณผ ์ ์์ง๋ง ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ 10000๊ฐ์ if err != nil
๊ฐ ์์ผ๋ฏ๋ก 1000๊ฐ๊ฐ ๊ฑฐ๋ํด ๋ณด์ด์ง๋ง ์ ์ฒด์ 10%์ ๋ถ๊ณผํฉ๋๋ค. .
@๊ตฟ์์ธ ๋ค. ์ด๋ฒ ์ฃผ์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ์๋ ์์ง๋ง ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๋ ๋ฆฝ์ ์ ๋๋ค. ์์ ๋กญ๊ฒ ์๋ํ๊ณ (๋ง์ฅ๋ ์๋ ์์), ๋ณต์ ํ๊ณ ํ์์ ๋ฐ๋ผ ์กฐ์ ํ์ญ์์ค.
defer try(f())
๊ฐ ๋ค์๊ณผ ๊ฐ์ง ์์ต๋๊น?
defer func() error {
if err:= f(); err != nil { return err }
return nil
}()
์ด๊ฒ์(if ๋ฒ์ ) ํ์ฌ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ง์ต๋๊น? ์ฌ๊ธฐ์์ ์์ธ๋ฅผ ๋ง๋ค์ด์๋ ์ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ ์ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์์ defer ์ฝ๋๊ฐ ๋ฐ๋์ ์๋ชป๋ ๊ฒ์ธ์ง ๋ช
ํํ์ง ์์ต๋๋ค. defer
๋ฌธ์์ close(file)
๊ฐ ์คํจํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ๊ทธ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํด์ผ ํฉ๋๊น, ๋ง์์ผ ํฉ๋๊น?
defer try(f())
defer try(f)
์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ทผ๊ฑฐ๋ฅผ ์ฝ์์ต๋๋ค. ์คํ๊ฐ ์๋๊น์?
go try(f())
์ ๋ํด์๋ ๋น์ทํ ์ฃผ์ฅ์ ํ ์ ์์ต๋๋ค.
go func() error {
if err:= f(); err != nil { return err }
return nil
}()
์ฌ๊ธฐ์ try
๋ ์ ์ฉํ ์์
์ ์ํํ์ง ์์ง๋ง ๋ฌดํดํฉ๋๋ค.
@ardan-bkennedy ์๊ฐํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ด ์ ์์ ์๋๋ฅผ ์๋ชป ํํํ๊ณ ๋ช ๊ฐ์ง ๊ทผ๊ฑฐ ์๋ ์ฃผ์ฅ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rsc ๊ฐ ์ด์ ์ ๋ค๋ฃจ์ง ์์ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ํด:
์ฐ๋ฆฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ค๋จ๋์๋ค๊ณ ๋งํ ์ ์ด ์์ต๋๋ค. ๋์์ธ์ ํ์ฌ ์ฒ๋ฆฌ๋ ๊ด์ฐฎ์ง๋ง ๋ง์ ๊ฒฝ์ฐ ์ฅํฉํ๋ค๋ ๊ด์ฐฐ(Go ์ปค๋ฎค๋ํฐ!)์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๊ฒ์ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ์ ์์ ์ฃผ์ ์ ์ ์ ๋๋ค.
์ผ์ ๋ ์ฝ๊ฒ ํ๋ฉด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์ด ๋์ ์๋ก๋ฅผ ๋ฐฐ์ ํ๊ฑฐ๋ ์ฌ์ง์ด ์๋ก๋ฅผ ์์ํ์ง๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ์ฝ๋ ๋ฅผ ์ดํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค. try
๋ฅผ ์ฌ์ฉํ๋ฉด ์๋นํ ์์ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๊ณ ๊ทธ ์์ฉ๊ตฌ๋ ์ฝ๋์ ์ดํด๋์ ์ฌ์ค์ ์๋ฌด ๊ฒ๋ ์ถ๊ฐํ์ง ์์ต๋๋ค. ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๊ธฐ ์ํ ํ์ค์ด์ ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง๋ ์ฝ๋ฉ ๋ฐฉ์์
๋๋ค.
"์ด ์ ์์ ๋ง์ ๋์์ธ ์ฒ ํ์ ์๋ฐํจ"์ ๊ดํ์ฌ: ์ค์ํ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ "๋์์ธ ์ฒ ํ"์ ๋ํด ๋ ๋จ์ ์ด์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ณ ์ ๋์์ธ ์ฒ ํ). ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ๋ช ๋ช ๋์ง ์์ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ๋ํด ๋ง์ "์ข ๊ต์ ์ด์ "(๋ ๋์ ์ฉ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์)์ด ์์ต๋๋ค. ์ปจํ ์คํธ์์ "์ด๋ฆ์ด ์ง์ ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค"์ ๊ฐ์ ์ง์ธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ์ผ๋ฐ์ ์ธ ์ง์นจ ์ญํ ์ ํ ์ ์์ง๋ง ์ ๋์ ์ธ ์ง์ค์ ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ ๋ณธ์ง์ ์ผ๋ก "๋์" ๊ฒ์ด ์๋๋๋ค. ์ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ API ๋ฌธ์์ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค. ์์ปจ๋, ์ธ์ด ๋์์ธ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ์ฌ๋ก๊ฑด์ ์ฌ์ฉํ์ง ๋ง์๋ค.
์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํ์ง ์๋ ๊ฒ์ด ์ด ์ ์์ ์์ ์ ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ ์ํ ๋ฟ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๊ธฐ๋ฅ์ ์ธ์ด๋ก ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ด์ฅ ๊ธฐ๋ฅ์ด Go์์ ์์ฐ์ค๋ฌ์ด ์์น์ ๋๋ค. ๋จ์ํ ํจ์์ผ ๋ฟ๋ง ์๋๋ผ ๋งค์ฐ ์ ํํ๊ฒ ์ ์๋์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ณด๋ค ํฌ๊ด์ ์ธ ์๋ฃจ์ ๋ณด๋ค ์ด ์ต์ํ์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํฉ๋๋ค. ํ ๊ฐ์ง ์์ ์ ๋งค์ฐ ์ ์ํํ๊ณ ์์์ ์ค๊ณ ๊ฒฐ์ ์ ๊ฑฐ์ ์๋ฌด ๊ฒ๋ ๋จ๊ธฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ๋ค๋ฅธ ์ธ์ด(์: Rust)๊ฐ ๋งค์ฐ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์์ต๋๋ค. "์ปค๋ฎค๋ํฐ๊ฐ ์ถ์ํ๊ฐ ๋น์ฉ์ ์จ๊ธฐ๊ณ ์ ๊ณตํ๋ ค๊ณ ํ๋ ๋จ์ํจ์ ๊ฐ์น๊ฐ ์๋ค๋ ๋ฐ ๋์ํ ๊ฒ"์ด๋ผ๊ณ ์ ์ํ๋ ๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ ์ ๋จ์ด๋ฅผ ๋ฃ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์ ์์ ๋ฐ๋ํ๋ ๋ชฉ์๋ฆฌ๋ฅผ ๋ถ๋ช ํ ๋ค์ ์ ์์ง๋ง, ์คํ์ ๊ณ์ํ๋ ๊ฒ์ ์ฐฌ์ฑ์ ํ๋ช ํ ์ฌ๋๋ค์ ์๋นํ ๋น์จ(์ถ์ 40%)์ด ์์ต๋๋ค. ๊ณผ์ฅ๋๊ฒ ๊ทธ๋ค์ ๋ฐํํ์ง ๋ง์๋ค.
๊ฐ์ฌ ํด์.
return isset( $_COOKIE[ CookieNames::CART_ID ] )
? intval( $_COOKIE[ CookieNames::CART_ID ] )
: null;
return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null;
FWIW์ฌ์ผ ํฉ๋๋ค. ๐
@bakul ์ธ์๊ฐ ์ฆ์ ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋๋ต ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<result list> := f()
defer try(<result list>)
์ด๊ฒ์ f()
๊ฐ ๋์ค์ ์ํด ์ฐ๊ธฐ๋์ง ์๊ณ ์ฆ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ฌ๋๋ค์๊ฒ๋ ์๊ธฐ์น ์์ ๋์์ผ ์ ์์ต๋๋ค. go try(f())
์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
@bakul ๋ฌธ์์์ defer try(f)
์ธ๊ธํฉ๋๋ค( try
defer try(f())
$๊ฐ ์๋๋ผ try(err)
๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด err
์ ํ์ด error
์ธ ๊ฒฝ์ฐ ). ๋ฐ๋ผ์ ์คํ๋ ์๋์ง๋ง ์ฒ์์๋ ํผ๋๋ ์ ์์ต๋๋ค. f
๋ ๋จ์ํ ํํ์์ ๋ํ๋ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ ํ.
@deanveloper , @griesemer ์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์ :-) ๊ฐ์ฌํฉ๋๋ค.
@carl-mastrangelo
_"
return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null;
์ด์ด์ผ ํฉ๋๋ค _
PHP 7.x๋ฅผ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๋ด๊ฐ ์๋์๋ค. ํ์ง๋ง ๋ค์, ๋น์ ์ ์ฐก๊ทธ๋ฆฐ ์ผ๊ตด์ ๋ณด๋ฉด ๊ทธ๊ฒ ์์ ์ด ์๋๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. :๋์ง:
์ ๋ ๋ด์ผ ์ด๋ฆฌ๋ ๋ฐ๋ ๋ชจ์์์ ์ด ํ ๋ก ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ก์ด ์๊ฐ์ ๋ฃ๊ธฐ ์ํด ์งง์ ์์ฐ์ ์ค๋นํ๊ณ ์์ต๋๋ค. ์ด ์ค๋ ๋์ ๋๋ถ๋ถ์ ์ฐธ๊ฐ์(๊ธฐ์ฌ์ ๋๋ ๊ด์ฐฐ์)๋ ์ธ์ด์ ๋ ๊น์ด ๊ด์ฌํ๋ ์ฌ๋๋ค์ด๋ฉฐ, "์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์๊ฐ ์๋๋๋ค"(์ง๊ฐ).
๊ทธ๋ ๊ฒ ํ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์ค๋ฅ์ ๋ํ ๋ชจ์๊ณผ ๋ ๊ฐ์ง ํจํด์ ๋ํ ํ ๋ก ์ด ์์๋ ๊ฒ์ ๊ธฐ์ตํ์ต๋๋ค.
type ExtErr struct{
error
someOtherField string
}
์ด๊ฒ๋ค ์ ์ฐ๋ฆฌ ํ์ด ์ค์ ๋ก ๊ตฌ์ถํ ๋ช ๊ฐ์ง ์คํ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ ์ Q&A ์ํ
Q: try์ ์ ๋ฌ๋ ๋ง์ง๋ง ์ธ์๋ ์ค๋ฅ ์ ํ์ด์ด์ผ ํฉ๋๋ค. ๋ค์ด์ค๋ ์ธ์๊ฐ ์ค๋ฅ์ ํ ๋นํ ์ ์๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ ์ด์ ๋ ๋ฌด์์
๋๊น?
A: "... ํ์ํ ๊ฒฝ์ฐ ํฅํ ์ด ๊ฒฐ์ ์ ๋ค์ ๊ฒํ ํ ์ ์์ต๋๋ค."
๋๊ตฌ๋ ์ ์ฌํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ธ๊ธํ ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ด ์์ ์ค๋ฅ ํ์ฅ ์ต์ ๋ชจ๋์ ๊ณตํต์ ์ธ์ง ์ดํดํ ์ ์์ต๋๊น?
@mikeschinkel ์ ๋ ๋น์ ์ด ์ฐพ๊ณ ์๋ Carl์ด ์๋๋๋ค.
@daved , ๋ค์:
์ด๋ฌํ ํธ์๋ฅผ ์ ๊ณตํ ์ ์๋ ์์น๋ ๋ถ์กฑํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ์ธํ๊ณ ๋ฉ์ปค๋์ฆ์ ์ค์ฒด๋ฅผ ์ฆ๋ช ํ ์ด๋ค ์ฒ๋๊ฐ ์ถ๊ตฌ๋๊ณ ์์ต๋๊น? ๋ถ๋ฅ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฌ๋ก ๋ชฉ๋ก์ด ์์ต๋๊น? ๋ง์ ๊ณต๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ ์ํด ์ข์ฐ๋ ๋ ๋ฐ์ดํฐ์์ ๊ฐ์น๊ฐ ์ด๋ป๊ฒ ๋์ถ๋ ๊น์?
๊ฒฐ์ ์ ์ด๊ฒ์ด ์ค์ ํ๋ก๊ทธ๋จ์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ฌ๋๋ค์ด ๋๋ถ๋ถ์ ์ฝ๋์์ ์๋๊ฐ ๋นํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค๋ฉด ๊ทธ๊ฒ์ ์ค์ํ ๋ฐ์ดํฐ์ ๋๋ค. ํ๋ก์ธ์ค๋ ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฐ์ดํฐ์ ์ํด ์ฃผ๋๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๊ฐ์ ์ ์ํด ์ฃผ๋๋๋ _์๋๋๋ค_.
์ค๋ฅ ์ปจํ ์คํธ
์ด ๋ฌธ์ ์์ ์ ๊ธฐ๋ ๊ฐ์ฅ ์ค์ํ ์๋ฏธ๋ก ์ ๋ฌธ์ ๋ try๊ฐ ์ปจํ ์คํธ์ ํจ๊ป ์ค๋ฅ ์ฃผ์์ ๋ ์ ๋๋ ๋ ๋์๊ฒ ์กฐ์ฅํ๋์ง ์ฌ๋ถ์ ๋๋ค.
์ง๋ 8์์ ๋ฌธ์ ๊ฐ์ ๋ ๋ฌธ์ ๋ฐ ๋ชฉํ ์น์ ์์ ์ผ๋ จ์ ์์ CopyFile ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ์๋ฃจ์ ์ด ์ฌ์ฉ์๊ฐ ์ค๋ฅ์ ์ ์ ํ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ _๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง๋๋ก ํ๋ ๊ฒ์ ๊ทธ ๋น์์ ์ค๋๋ ๋ชจ๋ ๋ช ๋ฐฑํ ๋ชฉํ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์๋๊ฐ ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ํ์ง ์์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์๋ํ๊ธฐ ์ ์ ์ ์ ํ ์ค๋ฅ ์ปจํ ์คํธ์ ๋ํด ๋ชจ๋ ๊ฐ์ ํ์ด์ง์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ค ์๋ os.Open์ ๋๋ค. Go ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ " ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ Go " ์ธ์ฉ:
์ปจํ ์คํธ๋ฅผ ์์ฝํ๋ ๊ฒ์ ์ค๋ฅ ๊ตฌํ์ ์ฑ ์์ ๋๋ค.
os.Open์์ ๋ฐํํ ์ค๋ฅ๋ "permission denied"๊ฐ ์๋๋ผ "open /etc/passwd: ๊ถํ ๊ฑฐ๋ถ๋จ" ํ์์ผ๋ก ํ์๋ฉ๋๋ค.
์ค๋ฅ์ ๋ํ Effective Go์ ์น์ ๋ ์ฐธ์กฐํ์ญ์์ค.
์ด ๊ท์น์ ์ต์ํ ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅผ ์ ์์ผ๋ฉฐ Go ์ฝ๋์์๋ ์ผ๊ด๋๊ฒ ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ๋ ค๋ ๋ถ๋ช ํ ๋ชฉํ๋ ์ฌ๋๋ค์ด ์ด ๊ท์น์ ๋ฐ๋ฅด๊ณ ์ ์ ํ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด ๋ ์ผ๊ด๋๊ฒ ๋ฐ๋ฅด๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ค๋๋ Go ๊ท์น์ ๋ฐ๋ฅด๋ ์ฝ๋๊ฐ ๋ง์ด ์์ง๋ง ๋ฐ๋ ๊ท์น์ ๊ฐ์ ํ๋ ์ฝ๋๋ ๋ง์ด ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ์ ๋๋ฌด ์ผ๋ฐ์ ์ ๋๋ค.
f, err := os.Open(file)
if err != nil {
log.Fatalf("opening %s: %v", file, err)
}
๋ฌผ๋ก ๋์ผํ ๊ฒ์ ๋ ๋ฒ ์ธ์ํฉ๋๋ค(๋ฐ๋ก ์ด ํ ๋ก ์ ๋ง์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค). ์ด๋ฌํ ๋ ธ๋ ฅ์ ์ผ๋ถ๋ ๋ชจ๋ ์ฌ๋์ด ๋ํ์ ๋ํด ์๊ณ ์ค์ํ๋๋ก ํด์ผ ํฉ๋๋ค.
Go ์ค๋ฅ ์ปจํ ์คํธ ๊ท์น์ ๋ฐ๋ฅด๋ ์ฝ๋์์ ์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ํจ์๊ฐ ๊ฐ ์ค๋ฅ ๋ฐํ์ ๋์ผํ ์ปจํ ์คํธ๋ฅผ ์ ์ ํ๊ฒ ์ถ๊ฐํ์ฌ ํ๋์ ์ฅ์์ด ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋๋๋ก ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด CopyFile ์์ ์์ ๊ฐ ๊ฒฝ์ฐ์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒ์ ๋ณต์ฌ ์ค์ธ ํญ๋ชฉ์ ๋ํ ์ธ๋ถ ์ ๋ณด์ ๋๋ค. ๋ค๋ฅธ ํน์ ๋ฐํ์ ๋ ๋ง์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋์ฒด๋ณด๋ค๋ ์ถ๊ฐ์ ๋๋ค. ์ด ์์์ด ํ๋ ธ๋ค๋ฉด ์์๋์๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ค์ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ช ํํ ์ฆ๊ฑฐ๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
Gophercon ์ฒดํฌ/ํธ๋ค ๋๋ํํธ ๋์์ธ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ ๊ฒ์ ๋๋ค:
func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
์ด ์ ์์ ์ด๋ฅผ ์์ ํ์ง๋ง ์์ด๋์ด๋ ๋์ผํฉ๋๋ค.
func CopyFile(src, dst string) (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}()
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
...
}
๊ทธ๋ฆฌ๊ณ ์ด ๊ณตํต ํจํด์ ๋ํด ์์ง ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๋์ฐ๋ฏธ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
func CopyFile(src, dst string) (err error) {
defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
...
}
์์ปจ๋, ์ด ์ ๊ทผ ๋ฐฉ์์ ํฉ๋ฆฌ์ฑ๊ณผ ์ฑ๊ณต์ ๋ค์ ๊ฐ์ ๊ณผ ๋ ผ๋ฆฌ์ ๋จ๊ณ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๊ทํ๊ฐ ๊ฑฐ์ง์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฐ์ ์ด๋ ๋ ผ๋ฆฌ์ ๋จ๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ์๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์๊ฒ ์๋ ค์ฃผ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ค์ ์ฝ๋ ๊ธฐ๋ฐ์ ์ฆ๊ฑฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋๋ค. ์๋๊ฐ ๋ถ์ ์ ํ๊ฑฐ๋ ์ํฉ์ ์ ํ์ํค๋ ์ผ๋ฐ์ ์ธ ํจํด์ ๋ณด์ฌ์ฃผ์ธ์. ์๋๊ฐ ์์๋ณด๋ค ๋ ํจ๊ณผ์ ์ด์๋ ์ฌ๋ก๋ฅผ ๋ณด์ฌ์ฃผ์ธ์. ๊ทํ์ ์ฝ๋ ๊ธฐ๋ฐ์ด ์ด๋ ํ ์ชฝ์ ์ํ๋์ง ์๋ํํ์ญ์์ค. ๋ฑ๋ฑ. ๋ฐ์ดํฐ๊ฐ ์ค์ํฉ๋๋ค.
๊ฐ์ฌ ํด์.
์ค๋ฅ ์ปจํ
์คํธ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ถ๊ฐ ์ ๋ณด์ ๋ํด @rsc ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํนํ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ด ์์ ์ ์ ๋ฅผ ์์ํ์ง๋ง ์ค๋ฅ ์ปจํ
์คํธ์ ๋ํ try
์ ๊ด๊ณ๋ฅผ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๋ฐ๋ผ์ ๋๋ถ๋ถ์ ํจ์๋ ์ ์ฒด๋ฅผ ์ค๋ช ํ๋ ํจ์ ์์ค ์ปจํ ์คํธ๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
์คํจํ ํน์ ํ์ ์กฐ๊ฐ(์ด ํ์ ์กฐ๊ฐ์ด ์ด๋ฏธ ์์ฒด ๋ณด๊ณ ํจ)์ด ์๋๋ผ ์์ ์ ๋๋ค.
๋ฐ๋ผ์ try
๊ฐ ๋์์ด ๋์ง ์๋ ๊ณณ์ ์ค๋ฅ๋ฅผ ์ปจํ
์คํธํํ๋ ๊ฒ์ด ์๋๋ผ ์ค๋ฅ์ ๋์ํด์ผ ํ ๋์
๋๋ค.
Cleaner, ๋ ์ฐ์ํ๊ณ ์๋ชป๋ ์๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์ค๋ฅ ์ฒ๋ฆฌ์์ ๋ฏธ๋ฌํ๊ฒ ์๋ชป๋ ํจ์์ ์๊ฐ ์์ต๋๋ค. try
๋ฐ defer
์คํ์ผ ์ค๋ฅ ๋ํ์ ์ฌ์ฉํ์ฌ Go์ ์ ์ฉํ์ต๋๋ค.
func AddNewGuy(name string) (guy Guy, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("adding guy %v: %v", name, err)
}
}()
guy = Guy{name: name}
guy.Team = ChooseRandomTeam()
try(guy.Team.Add(guy))
try(AddToLeague(guy))
return guy, nil
}
guy.Team.Add(guy)
๋ ์ฑ๊ณตํ์ง๋ง AddToLeague(guy)
๋ ์คํจํ๋ฉด ํ์ด ๋ฆฌ๊ทธ์ ์๋ ์๋ชป๋ Guy ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ guy.Team.Add(guy)
๋ฅผ ๋กค๋ฐฑํ๊ณ ๋ ์ด์ try
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
func AddNewGuy(name string) (guy Guy, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("adding guy %v: %v", name, err)
}
}()
guy = Guy{name: name}
guy.Team = ChooseRandomTeam()
try(guy.Team.Add(guy))
if err := AddToLeague(guy); err != nil {
guy.Team.Remove(guy)
return Guy{}, err
}
return guy, nil
}
๋๋ ์ค๋ฅ๊ฐ ์๋ ๋ฐํ ๊ฐ์ ๋ํด 0 ๊ฐ์ ์ ๊ณตํ์ง ์์ผ๋ ค๋ฉด return Guy{}, err
๋ฅผ try(err)
๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ defer
-ed ํจ์๋ ์ฌ์ ํ ์คํ๋๊ณ ์ปจํ
์คํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ try
๊ฐ ์ค๋ฅ์ ๋ํ ๋ฐ์์ ๊ฐ์กฐํ์ง๋ง ์ค๋ฅ์ ๋ํ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๋์ ์๋ฏธํฉ๋๋ค. ๊ทธ๊ฒ์ ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์์ํ๋ ๊ตฌ๋ณ์
๋๋ค. ํจ์๊ฐ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ ๋
์์๊ฒ ํน๋ณํ ๊ด์ฌ์ ๋์ง ์์ง๋ง ํจ์๊ฐ ์ค๋ฅ์ ๋ฐ์ํ๋ ๋ฐฉ์์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋์ ๋ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ๋ ์ฅํฉํ๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด try
๊ฐ ํ๋ ์ผ์
๋๋ค.
์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋๊ฑฐ๋ ํด๊ฒฐํ ๊ฐ์น๊ฐ ์๋ ๋ฌธ์ ๋ผ๊ณ ์ ์ํ ์ ์ผํ ์ฌ๋์ ์๋๋๋ค. ๊ทธ๋ฌํ ๋ค๋ฅธ ์๊ฒฌ์ https://swtch.com/try.html#nonissue ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๊ธฐ๋กํ๊ณ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
@rsc ๋ํ ํ์ฌ ์ค๋ฅ ์ฝ๋์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ฐ ์ ๋ฅผ ํฌํจ์์ผ ์ฃผ์ธ์.
Robert's tryhard์ ๊ฐ์ ๋๊ตฌ๊ฐ ์ด๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์์ ์ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋ฌด์์ ์ฐพ๋์ง ์๋ ค๋ฌ๋ผ๊ณ ์ด์ ์ ์์ฒญํ์ต๋๋ค. ๊ทธ ์ ๋ณด๋ ๋ณ๊ฒฝ์ด ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๊ฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋น์ ์ ํ๋์ ์ถ์ธก์ ํ๊ณ ๋๋ ๋ค๋ฅธ ์ถ์ธก์ ํฉ๋๋ค. ๊ด์ฐฎ์ต๋๋ค. ๋ต์ ์ด๋ฌํ ์ถ์ธก์ ๋ฐ์ดํฐ๋ก ๋์ฒดํ๋ ๊ฒ์ ๋๋ค.
https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go ๋ฅผ ๋ณด์๊ณ ์ด์ ์ฝ๋๊ฐ ๋ ์ข์ต๋๋ค. try ํจ์ ํธ์ถ์ด ํ์ฌ ์คํ์ ์ค๋จํ ์ ์๋ค๋ ์ฌ์ค์ด ๋๋์ต๋๋ค. ๊ทธ๊ฒ์ ํ์ฌ Go๊ฐ ์๋ํ๋ ๋ฐฉ์์ด ์๋๋๋ค.
์๊ฒฌ์ด ๋ค๋ฅผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋งค์ฐ ์ฃผ๊ด์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ด ํ ๋ก ์ ์ฐธ์ฌํ์ง ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ์ด ๋ณํ๊ฐ ์ค๊ณ ์๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ชจ๋ฆ ๋๋ค. ๋๋ ๋ฐ๋์ ๊ฝค ๊ด์ฌํ๊ณ ์์ง๋ง ์์ ์๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ณ๊ฒฝ์ ์ฐธ์ฌํ์ง ์์ต๋๋ค.
๊ธฐ์กด์ ๋ชจ๋ Go ์ฌ์ฉ์๊ฐ ์ด์ ๋ค๋ฅด๊ฒ ์๊ฐํ๋๋ก ์ฌ๊ต์กํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ์ฝ๋์์ try ์ฌ์ฉ์ ๊ฑฐ๋ถํ๋ ์ผ๋ถ ์ฌ์ฉ์/ํ์ฌ๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ํ์คํ ๋ช ๊ฐ์ง๋ ์์ ๊ฒ์ ๋๋ค.
ํ์ฌ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ฑํ๋ ค๋ฉด gofmt๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ "๋ถ๋" ์ฌ์ฉ์๊ฐ ์๋ก์ด ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด. gofmt์์ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๊น?
์ฌ๋๋ค์ด go1.13 ์ด์ ์ ์ฌ์ฉํ์ฌ try๋ก ์ฝ๋๋ฅผ ๋น๋ํ ๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์?
์ด ๋ณ๊ฒฝ์ ๊ตฌํํ๊ธฐ ์ํด ๊ทน๋ณตํด์ผ ํ ๋ค๋ฅธ ๋ง์ ๋ฌธ์ ๋ฅผ ๋์ณค์ ๊ฒ์ ๋๋ค. ์๊ณ ํ ๊ฐ์น๊ฐ ์์ต๋๊น? ๋๋ ๊ทธ๋ ๊ฒ ๋ฏฟ์ง ์๋๋ค.
์๋ ์ค
@griesemer
97 err's none catch๊ฐ ์๋ ํ์ผ์์ tryhard๋ฅผ ์๋ํ๋ ๋์ 2๊ฐ์ ํจํด์ด ๋ฒ์ญ๋์ง ์์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
1 :
if err := updateItem(tx, fields, entityView.DataBinding, entityInstance); err != nil {
tx.Rollback()
return nil, err
}
์๋ง๋ err := ์ ๋ฆฌํด ๋ผ์ธ ์ฌ์ด์ tx.Rollback() ๋๋ฌธ์ ๋์ฒด๋์ง ์์ต๋๋ค.
๋ด๊ฐ ๊ฐ์ ํ๋ ๊ฒ์ defer์ ์ํด์๋ง ์ฒ๋ฆฌ๋์ด์ผ ํ๊ณ ๋ชจ๋ ์ค๋ฅ ๊ฒฝ๋ก๊ฐ tx.Rollback()
์ด๊ฒ ์ณ์ ๊ฑฐ๋ ?
if err := db.Error; err != nil {
return nil, err
} else if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
return nil, err
} else {
return itemDb, nil
}
๋๋
if err := db.Error; err != nil {
return nil, err
} else {
if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
return nil, err
} else {
return itemDb, nil
}
return result, nil
}
์ด๊ฒ์ ์๋์ ๋๋ฌธ์ ๋๊น ์๋๋ฉด ์ค์ฒฉ ์๋๊ฐ ๋ก ๋ณํ๋ ๊น์? ์๋ฏธ - ์ด ์ฌ์ฉ์ ์๋ํ๊ฑฐ๋ err := ... return err๋ก ๋จ๊ฒจ๋๋๋ก ์ ์ํด์ผ ํฉ๋๊น?
@guybrand Re: ์ฐพ์ ๋ ๊ฐ์ง ํจํด:
1) ๋ค, tryhard
๋ ๋ณ๋ก ๋
ธ๋ ฅํ์ง ์์ต๋๋ค. ๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ ์ ํ ๊ฒ์ฌ๊ฐ ํ์ํฉ๋๋ค. ๋ชจ๋ ๊ฒฝ๋ก์์ tx.Rollback()
๋ฅผ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ defer
๊ฐ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ผ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด if
๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ผ ์ ์์ต๋๋ค. ํน์ ์ฝ๋์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
2) ์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. tryhard
๋ ์ด ๋ ๋ณต์กํ ํจํด์ ์ฐพ์ง ์์ต๋๋ค. ์ด์ฉ๋ฉด ๊ทธ๋ด ์ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ ๋ช ๊ฐ์ง ๋น ๋ฅธ ๋ต๋ณ์ ์ป๊ธฐ ์ํ ์คํ์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ ๋๋ก ํ๋ ค๋ฉด ์กฐ๊ธ ๋ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค.
@alexbrainman
์ฌ๋๋ค์ด go1.13 ์ด์ ์ ์ฌ์ฉํ์ฌ try๋ก ์ฝ๋๋ฅผ ๋น๋ํ ๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์?
๋ด ์ดํด๋ ์ธ์ด ์์ฒด์ ๋ฒ์ ์ด ์ปดํ์ผ๋๋ ๊ฐ ์ฝ๋ ์กฐ๊ฐ์ ๋ํ go.mod
ํ์ผ์ go
์ธ์ด ๋ฒ์ ์ง์๋ฌธ์ ์ํด ์ ์ด๋๋ค๋ ๊ฒ์
๋๋ค.
๊ธฐ๋ด go.mod
๋ฌธ์์๋ go
์ธ์ด ๋ฒ์ ์ง์๋ฌธ์ด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
๋์ด ์์ต๋๋ค.
go
์ง์๋ฌธ์ ์ํด ์ค์ ๋ ์์ ์ธ์ด ๋ฒ์ ์ ๋ค์์ ๊ฒฐ์ ํฉ๋๋ค.
๋ชจ๋์ ์ปดํ์ผํ ๋ ์ฌ์ฉํ ์ ์๋ ์ธ์ด ๊ธฐ๋ฅ.
ํด๋น ๋ฒ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ๋ฒ์ ์์ ์ ๊ฑฐ๋๊ฑฐ๋ ์ดํ ๋ฒ์ ์์ ์ถ๊ฐ๋ ์ธ์ด ๊ธฐ๋ฅ,
์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธ์ด ๋ฒ์ ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ฌ์ฉ ์ค์ธ Go ๋ฆด๋ฆฌ์ค์ ์ํด ๊ฒฐ์ ๋๋ ๋น๋ ํ๊ทธ.
๊ฐ์์ผ๋ก ์๋ก์ด try
๋ด์ฅ๊ณผ ๊ฐ์ ๊ฒ์ด Go 1.15์ ๊ฐ์ ๊ฒ์ด๋ผ๋ฉด, ๊ทธ ์์ ์์ go.mod
ํ์ผ์ด go 1.12
์ธ ์ฌ๋์ ์๋ก์ด try
์ ์ก์ธ์คํ ์ ์์ต๋๋ค. Go 1.15 ํด์ฒด์ธ์ผ๋ก ์ปดํ์ผํ๋๋ผ๋ go.mod
์ ์ ์ธ๋ Go ์ธ์ด ๋ฒ์ ์ go 1.12
์์ go 1.15
๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. try
์ 1.15 ์ธ์ด ๊ธฐ๋ฅ.
๋ฐ๋ฉด์ try
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์๊ณ ํด๋น ์ฝ๋๊ฐ go.mod
ํ์ผ์ด Go ์ธ์ด ๋ฒ์ ์ go 1.15
๋ก ์ ์ธํ๋ ๋ชจ๋์ ์์ง๋ง ๋๊ตฐ๊ฐ ๋ค์์ ์๋ํ๋ ๊ฒฝ์ฐ Go 1.12 ํด์ฒด์ธ์ผ๋ก ๋น๋ํ๋ฉด Go 1.12 ํด์ฒด์ธ์ด ์ปดํ์ผ ์ค๋ฅ์ ํจ๊ป ์คํจํฉ๋๋ค. Go 1.12 ํด์ฒด์ธ์ try
์ ๋ํด ์๋ฌด๊ฒ๋ ์์ง ๋ชปํ์ง๋ง ์ปดํ์ผ์ ์คํจํ ์ฝ๋๊ฐ go.mod
ํ์ผ์ ์๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก Go 1.15๊ฐ ํ์ํ๋ค๊ณ ์ฃผ์ฅํ๋ ์ถ๊ฐ ๋ฉ์์ง๋ฅผ ์ธ์ํ ๋งํผ ์ถฉ๋ถํ ์๊ณ ์์ต๋๋ค. . ์ค์ ๋ก ์ค๋์ Go 1.12 ๋๊ตฌ ๋ชจ์์ ์ฌ์ฉํ์ฌ ์ง๊ธ ๋ฐ๋ก ์ด ์คํ์ ์๋ํ๊ณ ๊ฒฐ๊ณผ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
.\hello.go:3:16: undefined: try
note: module requires Go 1.15
Go2 ์ ํ ์ ์ ๋ฌธ์ ์ ํจ์ฌ ๋ ๊ธด ๋ ผ์๊ฐ ์์ต๋๋ค.
์ฆ, ์ ํํ ์ธ๋ถ ์ฌํญ์ ๋ค๋ฅธ ๊ณณ์์ ๋ ์ ๋ ผ์๋ ์ ์์ต๋๋ค(์: #30791 ๋๋ ์ต๊ทผ golang-nuts ์ค๋ ๋ ).
@griesemer , ํ์์ ๋ํ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์์ฒญ์ ๋์ณค๋ค๋ฉด ์ฃ์กํ์ง๋ง ์ผ๋ถ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ๊ณ ์ผ๋ถ ํ์ฌ์ ์์ค ์ฝ๋์ ๋ํ ์ก์ธ์ค(๊ฐ๋ฅํ ๊ถํ)๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์๋๋ ์๊ท๋ชจ ํ๋ก์ ํธ์ ์ค์ ์์
๋๋ค. ์ฒจ๋ถ๋ ๊ฒฐ๊ณผ๊ฐ ์ข์ ์ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ์๋ ์ผ๋ถ ํ
์ด๋ธ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
์ด๊ณ = ์ฝ๋ ๋ผ์ธ ์
$find /path/to/repo -name '*.go' -exec cat {} \; | wc -l
Errs = err := ๊ฐ ์๋ ์ค ์ (์ด๊ฒ์ ์๋ง๋ err = ๋ฐ myerr := ๊ฐ ๋๋ฝ๋์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ปค๋ฒํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
tryhard = tryhard๊ฐ ์ฐพ์ ์ค ์
์ฐ๊ตฌ๋ฅผ ์ํด ํ
์คํธํ ์ฒซ ๋ฒ์งธ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํ๋์์ต๋๋ค.
์ด๊ณ = 5106
์ค๋ฅ = 111
๋
ธ๋ ฅํ๋ค = 16
๋ ํฐ ์ฝ๋ ๊ธฐ๋ฐ
์ด๊ณ = 131777
์ค๋ฅ = 3289
ํธ๋ผ์ดํ๋ = 265
์ด ํ์์ด ํ์ฉ๋๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ญ์์ค. ์ฌ๊ธฐ์ ๋์ง๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ํ์์ด ์๋๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ํ err := (๊ทธ๋ฆฌ๊ณ ์๋ง๋ err = , ๋ด๊ฐ ๋ฐฐ์ฐ๋ ค๊ณ ์๋ํ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋จ 4 ๊ฐ)์ ํ ์๋ฅผ ์ธ๋ ๊ฒ์ด ๋น ๋ฅผ ๊ฒ์
๋๋ค.
๊ฐ์ฌ ํด์.
https://github.com/golang/go/issues/32437#issuecomment -503276339์ @griesemer ์์
์๋ฅผ ๋ค์ด ์ด ์ฝ๋ ๋ฅผ ์ดํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
๊ทธ ์ฝ๋์ ๊ด๋ จํ์ฌ ์ฌ๊ธฐ์ ์์ฑ๋ ์ถ๋ ฅ ํ์ผ ์ด ๋ซํ์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ํ ์์ฑํ ํ์ผ์ ๋ซ์ ๋ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ ๋๋ง์ด ์ฐ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์๋ฆผ์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ฒ๊ทธ ๋ณด๊ณ ์๊ฐ ์๋๋ผ(๊ทธ๋์ผ ํ ์ง๋?), ํ์ง๋ง try
๊ฐ ๊ทธ๊ฒ์ ๊ณ ์น ์ ์๋ ๋ฐฉ๋ฒ์ ์ํฅ์ ์ฃผ๋์ง ์์๋ณด๊ธฐ ์ํ ๊ธฐํ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ณ ์น๊ธฐ ์ํด ์๊ฐํ ์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ด๊ฑฐํ๊ณ try
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ธ์ง ์๋๋ฉด ํด๊ฐ ๋ ๊ฒ์ธ์ง ๊ณ ๋ คํ ๊ฒ์
๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์
๋๋ค.
outf.Close()
์ ๋ํ ๋ช
์์ ํธ์ถ์ ์ถ๊ฐํฉ๋๋ค.func foo() (err error) {
outf := try(os.Create())
defer func() {
cerr := outf.Close()
if err == nil {
err = cerr
}
}()
...
}
defer outf.Close()
๋ฅผ ์ํํ๊ณ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฐํํ๊ธฐ ์ ์ try(outf.Close())
๋ฅผ ์ํํ๋ "์ด์ค ๋ซ๊ธฐ" ํจํด์
๋๋ค.func foo() error {
outf := try(os.Create())
if err := helper(outf); err != nil {
outf.Close()
return err
}
try(outf.Close())
return nil
}
์ฌ๋ก ๋ฒํธ 1์ ์ ์ธํ ๋ชจ๋ ๊ฒฝ์ฐ์์ try
๋ ์ต์
์ ์ค๋ฆฝ์ ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๊ธ์ ์ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ ํจ์์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ํฌ๊ธฐ์ ์๋ฅผ ๊ฐ์ํ ๋ ์ซ์ 1์ ๊ฐ์ฅ ์
๋ง์ ๋ง์ง ์๋ ์ต์
์ผ๋ก ๊ฐ์ฃผํ ๊ฒ์ด๋ฏ๋ก try
๋ฅผ ์ถ๊ฐํ๋ฉด ๋ถ์ ์ ์ธ ์ ํ์ ๋งค๋ ฅ์ด ์ค์ด๋ค ๊ฒ์
๋๋ค.
์ด ๋ถ์์ด ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ์์ผ๋ก ์๋ก์ด
try
๋ด์ฅ๊ณผ ๊ฐ์ ๊ฒ์ด Go 1.15์ ๊ฐ์ ๊ฒ์ ํฌํจ๋๋ค๋ฉด, ๊ทธ ์์ ์์go.mod
ํ์ผ์ดgo 1.12
์ธ ์ฌ๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
@pudds ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ชจ๋์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๋น์ ์ ์ค๋ช ์ ๋ด ๋จธ๋ฆฌ๋ฅผ ๋์ด.
์๋ ์ค
@alexbrainman
์ฌ๋๋ค์ด go1.13 ์ด์ ์ ์ฌ์ฉํ์ฌ try๋ก ์ฝ๋๋ฅผ ๋น๋ํ ๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์?
try
๊ฐ ๊ฐ์์ผ๋ก Go 1.15์ ๊ฐ์ ์ ํ์ ํฌํจ๋๋ค๋ฉด ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋งค์ฐ ์งง์ ๋๋ต์ Go 1.13์ ์ฌ์ฉํ์ฌ try
๋ก ์ฝ๋๋ฅผ ๋น๋ํ๋ ์ฌ๋์๊ฒ ๋ค์๊ณผ ๊ฐ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ํ์๋๋ค๋ ๊ฒ์
๋๋ค.
.\hello.go:3:16: undefined: try
note: module requires Go 1.15
(์ ์ด๋ ๋ด๊ฐ ์ ํ ์ ์์ ๋ํด ์ธ๊ธํ ๋ด์ฉ์ ์ดํดํ๋ ํ).
@alexbrainman ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋ํ ๋ง์ ์์ ์๊ฒฌ์ "์ด๊ฒ์ Go์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค", "Go๋ ๊ทธ๋ ๊ฒ ์๋ํ์ง ์์ต๋๋ค" ๋๋ "์ฌ๊ธฐ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ์์ํ์ง ์์ต๋๋ค"์ ๊ฐ์ ํ์์ ๋๋ค. ๋ง์ต๋๋ค. _existing_ Go๋ ๊ทธ๋ ๊ฒ ์๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ์๋ง๋ ๋ ์ค์ง์ ์ธ ๋ฐฉ์์ผ๋ก ์ธ์ด์ ๋๋์ ์ํฅ์ ๋ฏธ์น๋ ์ต์ด์ ์ ์๋ ์ธ์ด ๋ณ๊ฒฝ์ผ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ต์ํํ์ต๋๋ค. (๋๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ค๋ฆญ ์ ์์ด ์ผ์ผํฌ ์ ์๋ ์๋์ ์์ํ๊ธฐ ์ด๋ ต๋ค - ์ธ์ด ๋ณ๊ฒฝ์ ๋ํด ์ด์ผ๊ธฐํ๋ค).
๊ทธ๋ฌ๋ ์์ ์ผ๋ก ๋์๊ฐ์: ํ๋ก๊ทธ๋๋จธ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋ํ๊ณ ๋๋ผ๋ ๋ฐฉ์์ ์ต์ํด์ง๋๋ค. ์ฝ 35๋
๋์ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ๋ฐฐ์ด ๊ฒ์ด ์๋ค๋ฉด ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์ ์ต์ํด์ง๊ณ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ผ์ด๋๋ค๋ ๊ฒ์
๋๋ค. ์ต์ด์ ๊ณ ๊ธ ์ธ์ด๋ก ์๋์ ํ์ค์นผ์ ๋ฐฐ์ด ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋ชจ๋ ํค์๋๋ฅผ ๋๋ฌธ์๋ก ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ _์์ํ ์ ์๋_ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ "๋ชจ๋ ์๋ฌธ์๋ผ์ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์๋" C์ธ "๋จ์ด์ ๋ฐ๋ค"์ ์ต์ํด์ง๋ ๋ฐ ์ผ์ฃผ์ผ ์ ๋๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค. C๋ฅผ ์ฌ์ฉํ ์ด๊ธฐ ๋ฉฐ์น ํ, Pascal ์ฝ๋๋ ์์ฒญ๋๊ฒ ์ปค ๋ณด์๊ณ ๋ชจ๋ ์ค์ ์ฝ๋๋ ์ธ์น๋ ํค์๋์ ํผ๋ ์์ ๋ฌปํ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. Go๋ก ๋นจ๋ฆฌ ๋์๊ฐ์ ๋ด๋ณด๋ธ ์๋ณ์๋ฅผ ํ์ํ๊ธฐ ์ํด ๋๋ฌธ์๋ฅผ ๋์
ํ์ ๋ ์ด์ ์ ํค์๋ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์(Go๊ฐ ๊ณต๊ฐ๋๊ธฐ ์ )์์ ์ถฉ๊ฒฉ์ ์ธ ๋ณํ์์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ ๋์ ๋์์ธ ๊ฒฐ์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค(๊ตฌ์ฒด์ ์ธ ์์ด๋์ด๋ ์ค์ ๋ก Go ํ ์ธ๋ถ์์ ์ ๊ณต๋จ). ๋๋ ๋ค์ ์ฌ๊ณ ์คํ์ ๊ณ ๋ คํ์ญ์์ค. Imagine Go์๋ defer
๋ฌธ์ด ์์๊ณ ์ด์ ๋๊ตฐ๊ฐ defer
์ ๋ํ ๊ฐ๋ ฅํ ์ฌ๋ก๋ฅผ ๋ง๋ญ๋๋ค. defer
์๋ ์ธ์ด์ ๋ค๋ฅธ ์ด๋ค ๊ฒ๊ณผ๋ ๊ฐ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ์ธ์ด๋ defer
์ด์ ์ฒ๋ผ ๋ ์ด์ ๋๊ปด์ง์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ 10๋
๋์ ํจ๊ป ์ด์๋ณด๋ ์์ ํ "๋ฐ๋"์ฒ๋ผ ๋ณด์
๋๋ค.
์์ ์ ์ธ์ด ๋ณ๊ฒฝ์ ๋ํ ์ด๊ธฐ ๋ฐ์์ ์ค์ ์ฝ๋์์ ๋ฉ์ปค๋์ฆ์ ์ค์ ๋ก ์๋ํ๊ณ ๊ตฌ์ฒด์ ์ธ ํผ๋๋ฐฑ์ ์์งํ์ง ์๊ณ ๋ ๊ฑฐ์ ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฌผ๋ก ๊ธฐ์กด์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ ๊ด์ฐฎ๊ณ try
๋ฅผ ์ฌ์ฉํ๋ ๋์ฒด ์ฝ๋๋ณด๋ค ๋ ๋ช
ํํด ๋ณด์
๋๋ค. ์ฐ๋ฆฌ๋ 10๋
๋์ ์ด๋ฌํ if
๋ช
๋ น๋ฌธ์ ๋ฉ๋ฆฌ ์๊ฐํ๋๋ก ํ๋ จ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก try
์ฝ๋๋ ์ด์ํด ๋ณด์ด๊ณ "์ด์ํ" ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์ด ์์ผ๋ฉฐ ์ธ์ด์ ์ผ๋ถ๋ก ์ฆ์ ์ธ์ํ์ง ๋ชปํฉ๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ๋๋ค์๊ฒ ์์ ์ ์ฝ๋์์ ์คํ์ ํตํด ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ฐธ์ฌํ๋๋ก ์์ฒญํ๋ ์ด์ ์
๋๋ค. ์ฆ, ์ค์ ๋ก ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ tryhard
์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋๋ ๊ทธ๊ฒ์ ์ ์ ๋์, ์๋ง๋ ์ผ์ฃผ์ผ ์ ๋ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์๋ณด๊ณ ๋ค์๋ณด๊ณ ํ์ญ์์ค.
๋ง์ง๋ง์ผ๋ก, ๋๋ค์์ ์ฌ๋๋ค์ด ์ด ์ ์์ ๋ํด ์์ง ๋ชปํ๊ฑฐ๋ ์ฐธ์ฌํ์ง ์์๋ค๋ ๊ทํ์ ํ๊ฐ์ ๋์ํฉ๋๋ค. ์ด ํ ๋ก ์ด ์๋ง ์ญ์ฌ ๋ช ์ ๋๊ฐ ์ฃผ๋ํ๊ณ ์๋ค๋ ๊ฒ์ ์์ฃผ ๋ถ๋ช ํฉ๋๋ค. ํ์ง๋ง ์์ง ์๊ธฐ์์กฐ์ด๊ณ ์ด ์ ์์ด ๋์จ ์ง 2์ฃผ๋ฐ์ ์ ๋์๊ณ ๊ฒฐ์ ์ด ๋ด๋ ค์ง์ง ์์์ต๋๋ค. ๋ ๋ง์ ๋ค์ํ ์ฌ๋๋ค์ด ์ด์ ์ฐธ์ฌํ ์ ์๋ ์ถฉ๋ถํ ์๊ฐ์ด ์์ต๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -503297387 ์ ๋ฐ๋ฅด๋ฉด ๋จ์ผ ๊ธฐ๋ฅ์์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒฝ์ฐ ๋ถ๋ช ํ ์๋ชปํ๊ณ ์๋ ๊ฒ์ ๋๋ค. ํํธ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ๋ง์ด ์์ต๋๋ค.
if err := gen.Execute(tmp, s); err != nil {
return fmt.Errorf("template error: %v", err)
}
if err := tmp.Close(); err != nil {
return fmt.Errorf("cannot write temp file: %v", err)
}
closed = true
if err := os.Rename(tmp.Name(), *genOutput); err != nil {
return fmt.Errorf("cannot finalize file: %v", err)
}
removed = true
( closed
๋ฐ removed
๋ ์ ์ ํ๊ฒ ์ ๋ฆฌํ๊ธฐ ์ํด ์ง์ฐ์ ์ฌ์ฉ๋จ)
์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด ๊ธฐ๋ฅ์ ์ต์์ ์๋ฌด๋ฅผ ์ค๋ช ํ๋ ๋์ผํ ์ปจํ ์คํธ๊ฐ ์ฃผ์ด์ ธ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ๋ง ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
processing path/to/dir: template: gen:42:17: executing "gen" at <.Broken>: can't evaluate field Broken in type main.state
ํ ํ๋ฆฟ์ด ์๋ง์ด ๋์์ ๋ "ํ ํ๋ฆฟ ์คํ"์ด๋ ์ฝ๊ฐ์ ์ถ๊ฐ ๋นํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ ํ๋ฆฟ ์คํ ํธ์ถ์ ๋ํ ๋ด ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ฑ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. (๊ฐ์ฅ ํฐ ๋งฅ๋ฝ์ ์๋์ง๋ง ๋ง๋ค์ด์ง ์์ ๋์ ์ค์ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ณ ์ถ์์ต๋๋ค.)
์ฌ์ฉ์๊ฐ ๋ณผ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
processing path/to/dir: rename /tmp/blahDs3x42aD commands.gen.go: No such file or directory
๋ด ํ๋ก๊ทธ๋จ์ด ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๊ณ ํ๋ _์ด์ _์ ๋ํ ๋จ์ ์์ด ์๋ฏธ๋ก ์ ๋ฌด์์ด๋ฉฐ ์๋๋ ๋ฌด์์ ๋๊น? "cannot finalize file:"์ ์ฝ๊ฐ ์ถ๊ฐํ๋ฉด ์ ๋ง ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ์๊ฐ ์ถฉ๋ถํ ์ค๋๋ ฅ์ด ์๋ค๋ฉด ๋ช ๋ น์ค ์ฑ์์ ๋ค์ ์ค๋ฅ ์ถ๋ ฅ์ ์์ํด ๋ณด์ญ์์ค.
processing path/to/dir: open /some/path/here: No such file or directory
๊ทธ๊ฒ ๋ฌด์จ ๋ป์ด์ผ? ์ฑ์ด ๊ฑฐ๊ธฐ์ ํ์ผ์ ๋ง๋ค๋ ค๊ณ ํ ์ด์ ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค(os.Open๋ฟ๋ง ์๋๋ผ ์์ฑ์ธ ์ค๋ ๋ชฐ๋์ต๋๋ค! ์ค๊ฐ ๊ฒฝ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ ENOENT์ ๋๋ค.). ์ด๊ฒ์ ์ด ํจ์์์ _every_ ์ค๋ฅ ๋ฐํ์ ์ถ๊ฐ๋์ด์ผ ํ๋ ๊ฒ์ด ์๋๋๋ค.
๊ทธ๋์, ๋ด๊ฐ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น? ๋ด๊ฐ "์๋ชป ์ก๊ณ " ์์ต๋๊น? ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ํํ๊ธฐ ์ํด ์ง์ฐ์ ์ฌ์ฉํ๋ ๋ณ๋์ ์์ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ฌํ ๊ฐ ํญ๋ชฉ์ ๋ฐ์ด์ผ ํฉ๋๊น?
@guybrand ์ด๋ฌํ ์ซ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. tryhard
์ซ์๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ง๋ ํน์ ์ค๋ฅ ์ฅ์์ด ๋ง์ด ์งํ๋๊ณ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ํ๋ฅญํ๋ฉฐ if
๋ฌธ์ด ์ฌ๋ฐ๋ฅธ ์ ํ์
๋๋ค.
๋๊ตฌ์ ๋๋ฌํ๋ฉด ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
@tv42 https://github.com/golang/go/issues/32437#issuecomment -503340426์ ์์์ "์๋ชป"ํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด if
๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๋ค๋ฅธ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค. try
๋ ๋์์ด ๋์ง ์์ผ๋ฉฐ defer
๋ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๋ฟ์
๋๋ค(์ด ์ค๋ ๋์ ๋ค๋ฅธ ์ธ์ด ๋ณ๊ฒฝ ์ ์์ ์ด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก if
์๋ก์ด ๋ฉ์ปค๋์ฆ์ ๋์
ํ ๊ฐ์น๊ฐ ์๋ค๋ ์ง์ ). ์ธ๋ถ ์ ์์ FAQ๋ ์ฐธ์กฐํ์ญ์์ค.
@griesemer ๊ทธ๋ ๋ค๋ฉด ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๊ฒ์ ๋น์ ๊ณผ @rsc ๊ฐ ๋์ํ์ง ์๋๋ค๋ ๊ฒ๋ฟ์ ๋๋ค. ๋๋ ๋ด๊ฐ "์๋ชป๋ ์ผ์ ํ๊ณ ์๋ค"๊ณ ๋งํ๋ฉฐ ์ด์ ๋ํด ๋ํ๋ฅผ ๋๋๊ณ ์ถ์ต๋๋ค.
๋ชจ๋ ์๋ฃจ์ ์ด ์ฌ์ฉ์๊ฐ ์ค๋ฅ์ ์ ์ ํ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๊ฒ์ ๊ทธ ๋น์์ ์ค๋๋ ๋ชจ๋ ๋ช ๋ฐฑํ ๋ชฉํ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์๋๊ฐ ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ํ์ง ์์์ ๊ฒ์ ๋๋ค.
@tv42 @rsc ๊ฒ์๋ฌผ์ ์ข์ ์ฝ๋์ ์ ๋ฐ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ์กฐ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ ๋ ๋์ํฉ๋๋ค. ์ด ํจํด์ ์ ํํ ๋ง์ง ์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์๊ณ ์ฝ๋์ ๋ง์กฑํ๋ค๋ฉด ๊ทธ๋๋ก ๋์ญ์์ค.
์ฐ๊ธฐํ๋ค
Gophercon ์ฒดํฌ/ํธ๋ค ์ด์ ์์ ์ด ์ ์์ผ๋ก์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ defer
์ฌ์ฌ์ฉ์ ์ํด handle
๋ฅผ ์ญ์ ํ ๊ฒ์
๋๋ค. ์ด์ ์ด ์ง์ฐ๋ ํธ์ถ๊ณผ ๊ฐ์ ์ฝ๋์ ์ํด ์ค๋ฅ ์ปจํ
์คํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค(์ค๋ฅ ์ปจํ
์คํธ์ ๋ํ ์ด์ ์ฃผ์ ์ฐธ์กฐ).
func CopyFile(src, dst string) (err error) {
defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
์ด ์์์ ์ค๋ฅ ์ฃผ์ ๋ฉ์ปค๋์ฆ์ผ๋ก defer์ ์คํ ๊ฐ๋ฅ์ฑ์ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
_๋ช ๋ช ๋ ์ค๋ฅ ๊ฒฐ๊ณผ._ ๋ช ๋ช ๋ ์ค๋ฅ ๊ฒฐ๊ณผ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ๋ง์ ์ฐ๋ ค๊ฐ ์์์ต๋๋ค. ๊ณผ๊ฑฐ์๋ ๋ฌธ์ํ ๋ชฉ์ ์ผ๋ก ํ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๊ถ์ฅํ์ง ์์์ง๋ง ๋ ๊ฐ๋ ฅํ ๊ฒฐ์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ์ ํํ ๊ท์น์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณผ๊ฑฐ์๋ ๋ฌธ์์์ ํน์ ๊ฒฐ๊ณผ๋ฅผ ์ธ๊ธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ ๊ฐ๋ ฅํ ๊ฒฐ์ ์์ธ์ด ์ด๋ฆ ์๋ ๊ฒฐ๊ณผ์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ด๋ก๋ฅผ ๋ฅ๊ฐํ์ต๋๋ค. ์ด์ ๋ ๋ฒ์งธ๋ก ๊ฐ๋ ฅํ ๊ฒฐ์ ์์ธ์ด ์์ต๋๋ค. ์ฆ, ์ฐ๊ธฐ์ ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ๋ ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ฌธ์ํ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฒฐ๊ณผ๋ฅผ ๋ช ๋ช ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด์ ๋ถ์พํ์ง ์์์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด์ ๋ํด ์๋นํ ๋ถ์ ์ ์ธ ๋ฐ์์ ๋ณด์๊ณ ์์งํ ๊ทธ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฌ๋๋ค์ด ํํ์ ๋ชฉ๋ก์ด ์๋ ์์ต(์์ "๋ค์ดํค๋ ์์ต")๊ณผ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ๋ฅผ ํผ๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ํํ์ ๋ชฉ๋ก์ด ์๋ ๋ฐํ์ ๋ ํฐ ํจ์์์ ํผ๋์ ์ผ์ผํฌ ์ ์๋ ๊ฒ์ด ์ฌ์ค์ ๋๋ค. ๊ธด ํจ์์์ ์ด๋ฌํ ๋ฐํ์ ํผํจ์ผ๋ก์จ ํผ๋์ ํผํ๋ ๊ฒ์ ์ข ์ข ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋์ผํ ๋ธ๋ฌ์๋ก ๋ช ๋ช ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ํ์ง ์์ต๋๋ค.
_์ฃผ์ ํํ._ ๋ช๋ช ์ฌ๋๋ค์ ์ด ํจํด์ ์ฌ์ฉํ๋ ค๋ฉด Go ๊ฐ๋ฐ์๊ฐ ์ฃผ์ ํํ์ ์ดํดํด์ผ ํ๋ค๋ ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ํฌ์ธํฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ธํฐํ์ด์ค์ ์ ์ฅํ๋ ๊ฒ์ ์ด๋ฏธ ์ด๋ฅผ ์๊ตฌํ๋ฏ๋ก ์ด๋ ํฐ ๋จ์ ์ผ๋ก ๋ณด์ด์ง ์์ต๋๋ค.
_Defer ์์ฒด._ ์๋ก์ด ์ฌ์ฉ์๊ฐ ์ต์ํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ฌ๋๋ค์ defer๋ฅผ ์ธ์ด ๊ฐ๋
์ผ๋ก ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฐ๋ ค๋ฅผ ์ ๊ธฐํ์ต๋๋ค. ์ฃผ์ ํํ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก defer๋ ๊ฒฐ๊ตญ ๋ฐฐ์์ผ ํ๋ ํต์ฌ ์ธ์ด ๊ฐ๋
์
๋๋ค. defer f.Close()
๋ฐ defer l.mu.Unlock()
$์ ๊ฐ์ ํ์ค ๊ด์ฉ๊ตฌ๋ ๋๋ฌด ์ผ๋ฐ์ ์ด์ด์ ์ธ์ด์ ๋ชจํธํ ๊ตฌ์์ผ๋ก defer๋ฅผ ํผํ๋ ๊ฒ์ ์ ๋นํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
_Performance._ ์ฐ๋ฆฌ๋ ํจ์ ๋งจ ์์ ์๋ defer์ ๊ฐ์ ์ผ๋ฐ์ ์ธ defer ํจํด์ ๋ง๋ค ๋๋ง๋ค ๊ฐ ๋ฐํ์์ ์๋์ผ๋ก ํธ์ถ์ ์ฝ์ ํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ์ค๋ฒํค๋๊ฐ 0์ด ๋๋๋ก ๋ง๋๋ ์์ ์ ๋ํด ์๋ ๋์ ๋ ผ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ๋ค์ Go ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด ๊ทธ๊ฒ์ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์๋๋ผ๋ ์ค๋ฅ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๋๋ถ๋ถ์ ํธ์ถ์ ๋ํด ์ฝ 50ns์ ํ์ฌ ์ค๋ฒํค๋๊ฐ ๊ธ์ง๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์์์ ํธ์ถ์ defer๊ฐ ๋ ๋นจ๋ผ์ง ๋๊น์ง ๊ณ์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฒ์ ์ธ ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ ๋ชจ๋ ๊ธฐ์กด ์ธ์ด ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ๋ฐ๋์ ํด๋นํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด ์ธ์ด ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ํ์ธ/์ฒ๋ฆฌ๋ณด๋ค ์ด ์ ์์ ๋ฐ์ ์ ๋๋ค. ์ฆ, ํต์ฌ ์ธ์ด์ ์ถ๊ฐํ ๊ฒ์ด ์ ๊ณ , ๋ฐฐ์ธ ์๋ก์ด ๋ถ๋ถ์ด ์ ๊ณ , ๋๋ผ์ด ์ํธ ์์ฉ์ด ๋ ์ ์ต๋๋ค.
๊ทธ๋๋ ์ฐ๋ฆฌ๋ ์ด ๋ฐฉ์์ผ๋ก defer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋กญ๊ณ defer๊ฐ ์ค์ ๋ก ํ์ํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ด์ฉ๊ตฌ์ ๋ํด ์ถฉ๋ถํ ์ ์๋ํ๋์ง ํ๊ฐํ ์๊ฐ์ ์ค ํ์๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ง๋ 8์์ ์ด ํ ๋ก ์ ์์ํ ์ดํ๋ก ์ ๋ "์ด ์ฝ๋๊ฐ ๊ฒ์ฌ/ํธ๋ค๊ณผ ํจ๊ป ์ด๋ป๊ฒ ๋ณด์ผ ๊ฒ์ธ๊ฐ?"๋ผ๋ ์ ์ ์ ์ธ ์ฐ์ต์ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์๋ "with try/defer?" ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ต์ ๋ด๊ฐ ๋งค๋ฒ ๋ฆฌํดํ ๋๋ง๋ค ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ์๋ตํ๋ ๋์ ํ ๊ณณ(์ง์ฐ)์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ ๋์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ง์ฐ๋ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ์ ๋ํ ์กฐ์น๋ฅผ ์ทจํ๋ค๋ ์์ด๋์ด๊ฐ ์ฃผ์ด์ง๋ฉด ๊ฐ๋จํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง๋ก ๋ค์ํ ํจํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๋ํด ๋ ์๊ฐํ๊ธฐ ์ํด #32676์ ์ ์ถํ์ง๋ง ํด๋น ๋ฌธ์ ์์ ํจํค์ง API๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
func CopyFile(src, dst string) (err error) {
defer errd.Add(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
CopyFile์ ๋๋ฒ๊น ์ค์ด๊ณ ๋ฐํ๋ ์ค๋ฅ ๋ฐ ์คํ ์ถ์ (๋๋ฒ๊ทธ ์ธ์๋ฅผ ์ฝ์ ํ๋ ค๋ ๊ฒ๊ณผ ์ ์ฌ)์ ๋ณด๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
func CopyFile(src, dst string) (err error) {
defer errd.Trace(&err)
defer errd.Add(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
๋ฑ๋ฑ.
์ด๋ฐ ์์ผ๋ก defer๋ฅผ ์ฌ์ฉํ๋ฉด ์๋นํ ๊ฐ๋ ฅํด์ง๋ฉฐ ํจ์ ๋งจ ์์ ํ ๋ฒ "๋ชจ๋ ์ค๋ฅ์ ๋ํด ์ด ์์ ์ ์ํ"์ด๋ผ๊ณ ์ฐ๊ณ ๋๋จธ์ง๋ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค๋ ์ฒดํฌ/ํธ๋ค์ ์ด์ ์ ์ ์งํฉ๋๋ค. ๋ชธ. ์ด๊ฒ์ ์ด๊ธฐ ๋น ๋ฅธ ์ข ๋ฃ ์ ๊ฑฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ ์ฑ์ ํฅ์์ํต๋๋ค.
์ด๊ฒ์ด ์ค์ ๋ก ์๋ํฉ๋๊น? ์ฐ๋ฆฌ๋ ์๊ณ ์ถ์ต๋๋ค.
๋ช ๊ฐ์ ๋์ ๋ด ์ฝ๋์์ defer๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๋ํ ์ ์ ์ ์คํ์ ํ ๊ฒฐ๊ณผ ์๋ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌผ๋ก ์ค์ ์ฝ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํญ์ ๊ฐ์ ๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์๋ด๊ธฐ ์ํด ์คํ์ ํด์ผ ํ ๊ฒ์ ๋๋ค.
์ฌ๋๋ค์ if err != nil
๋ฌธ์ ๊ณ์ ์์ฑํ๋ฉด์ ์ง์ฐ ๋์ฐ๋ฏธ๋ฅผ ๋ณต์ฌํ๊ณ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ ์ค๋๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์คํํ ์ ์์ต๋๋ค. ์ด ์์
์ ์ํํ ์ํฅ์ด ์๋ ๊ฒฝ์ฐ ๋ฐฐ์ด ๋ด์ฉ์ ์๋ ค์ฃผ์ญ์์ค.
@tv42 , @griesemer๋ ๋ง์์ ๋์ํฉ๋๋ค. ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๊ฐ "์๋ฃ" ๋จ๊ณ์ธ ๊ฒ์ฒ๋ผ ์ฐ๊ฒฐ์ ์ํํ๊ฒ ํ๊ธฐ ์ํด ์ถ๊ฐ ์ปจํ ์คํธ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด if ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ๊ธฐ๋ฅ์์ ์ด๋ฌํ ์ถ๊ฐ ์ปจํ ์คํธ๊ฐ ๊ฑฐ์ ํ์ํ์ง ์์ต๋๋ค.
@guybrand , tryhard ์ซ์๋ ํ๋ฅญํ์ง๋ง ํน์ ์๊ฐ ๋ณํ๋์ง ์์ ์ด์ ์ ๋ํ ์ค๋ช ์ด ๋ ์ข์ ๊ฒ์ด๋ฉฐ ๋ ๋์๊ฐ ๋ณํ์ด ๊ฐ๋ฅํ๋๋ก ๋ค์ ์์ฑํ๋ ๊ฒ์ด ๋ถ์ ์ ํ์ ๊ฒ์ ๋๋ค. @tv42 ๋ ์ ์์์ ์ค๋ช ์ด ๊ทธ ์์ ๋๋ค.
defer ์ ๋ํ ์ฐ๋ ค์ ๋ํด @griesemer . ๋๋ ๊ทธ emit
๋๋ ์ด๊ธฐ ์ ์์ handle
๋ก ๊ฐ๊ณ ์์์ต๋๋ค. err
๊ฐ nil์ด ์๋๋ฉด emit/handle
๊ฐ ํธ์ถ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์์ ๋์ด ์๋๋ผ ๊ทธ ์๊ฐ์ ์์๋ฉ๋๋ค. defer๋ ๋ง์ง๋ง์ ํธ์ถ๋ฉ๋๋ค. emit/handle
err
๊ฐ nil์ธ์ง ์๋์ง์ ๋ฐ๋ผ ํจ์๋ฅผ ์ข
๋ฃํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๊ธฐ๊ฐ ์๋ํ์ง ์๋ ์ด์ ์
๋๋ค.
์ผ๋ถ ๋ฐ์ดํฐ:
๋ด๊ฐ ์ข ๊ต์ ์ผ๋ก "๋ค์ดํค๋ ์ค๋ฅ ๋ฆฌํด"์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋งค์งํด ์จ ~70k LOC ํ๋ก์ ํธ ์ค์์ ์ฐ๋ฆฌ๋ ์ฌ์ ํ 612๊ฐ์ ๋ค์ดํค๋ ์ค๋ฅ ๋ฆฌํด์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฃผ๋ก ์ค๋ฅ๊ฐ ๊ธฐ๋ก๋๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋ฉ์์ง๋ ๋ด๋ถ์ ์ผ๋ก๋ง ์ค์ํฉ๋๋ค(์ฌ์ฉ์์๊ฒ ๋ณด๋ด๋ ๋ฉ์์ง๋ ๋ฏธ๋ฆฌ ์ ์๋จ). try()๋ ์ฌ์ ์ ์๋ ์ค๋ฅ๋ก ํธ๋ค๋ฌ๋ฅผ ์ฐ๊ธฐํ๊ณ ๋ ๋ง์ ์์น์์ try๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ค์ดํค๋ ๋ฆฌํด๋น ๋จ ๋ ์ค๋ณด๋ค ์ ์ฝํ ์ ์์ต๋๋ค.
๋ ํฅ๋ฏธ๋กญ๊ฒ๋ ๊ณต๊ธ์ ์ฒด ๋๋ ํ ๋ฆฌ์๋ ~620k+ LOC ์ค 1600๊ฐ์ ๊ธฐ๋ณธ ์ค๋ฅ ๋ฐํ๋ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐ๋ฆฌ๋ณด๋ค ํจ์ฌ ๋ ์ข ๊ต์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
@rsc ๋์ค์ try
func Wrap(msg string) func(error) error
์ ๊ฐ์ ๊ธฐ๋ฅ์ด ์๋ ์ค๋ฅ/errc ํจํค์ง๊ฐ ์์ผ๋ฏ๋ก try(f(), errc.Wrap("f failed"))
๋ฅผ ์ํํ ์ ์์ต๋๊น?
@damienfamed75 ์ค๋ช
๊ฐ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ emit
๋ try
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ๋ ํธ์ถ๋๋ฉฐ ํด๋น ์ค๋ฅ์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. ์ถฉ๋ถํ ๋ช
ํํด ๋ณด์
๋๋ค.
๋ํ emit
๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ํจ์๋ฅผ ์ข
๋ฃํ๊ณ ์ค๋ฅ๊ฐ ์ด๋ป๊ฒ๋ ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ข
๋ฃํ๋ค๊ณ ๋งํ๊ณ ์์ต๋๋ค. ํจ์๋ฅผ ์ข
๋ฃํ์ง ์์ผ๋ฉด ์ฝ๋๋ ์ด๋์์ ๊ณ์๋ฉ๋๊น? ์๋ง๋ try
์์ ๋์์ค๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค(๊ทธ๋ ์ง ์์ผ๋ฉด ํจ์๋ฅผ ์ข
๋ฃํ์ง ์๋ emit
๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค). ์ด ๊ฒฝ์ฐ try
if
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๊ณ ๋ช
ํํ์ง ์์๊น์? emit
๋๋ handle
๋ฅผ ์ฌ์ฉํ๋ฉด ํนํ emit
์ ์ด ํจ์์ ์์ ํ ๋ค๋ฅธ ๋ถ๋ถ(์๋ง๋ ์ด์ )์ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฒฝ์ฐ ์ ์ด ํ๋ฆ์ ํฌ๊ฒ ๋ชจํธํ๊ฒ ๋ง๋ญ๋๋ค. (์ฐธ๊ณ ๋ก, emit
๊ฐ ํ๋ ์ด์ ์์ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ ์ ๋ ๊น์? emit
๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ์๋ check
์ ๊ดด๋กญํ๋ ๋์ผํ ์ง๋ฌธ์ด ๋ง์ด ์์ต๋๋ค. handle
์ด์ ๋์์ธ.)
์ค๋ฅ ์ฅ์ ์ธ์ ๋ง์ ์ถ๊ฐ ์์
์์ด ๋๋ ํญ์ ๋์ผํ ์์
์ผ๋ก ํจ์์์ ๋ฐํํ๋ ค๋ ๊ฒฝ์ฐ์๋ง try
๋ฐ ์ผ์ข
์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ๋ฐํ๋๊ธฐ ์ ์ ์คํ๋๋ ํธ๋ค๋ฌ ๋ฉ์ปค๋์ฆ์ ์ด๋ฏธ defer
์ ์กด์ฌํฉ๋๋ค.
@guybrand (๋ฐ @griesemer)์ ๋ ๋ฒ์งธ ์ธ์ํ ์ ์๋ ํจํด์ https://github.com/griesemer/tryhard/issues/2 ๋ฅผ ์ฐธ์กฐํ์ธ์.
@daved
๋ง์ ๊ณต๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ ์ํด ์ข์ฐ๋ ๋ ๋ฐ์ดํฐ์์ ๊ฐ์น๊ฐ ์ด๋ป๊ฒ ๋์ถ๋ ๊น์?
์๋ง๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฌ๊ธฐ์ ๋ณด๊ณ ๋ ๋์ ๊ฐ์ ๊ฒฝํ์ด ์์ ์ ์์ต๋๋ค. tryhard
try
์ ๋ช ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ์ดํด๋ณด๊ณ ์ด ์ค๋ ๋์ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋น์ทํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ๊ณ์ ์งํํ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค. ๋์ try
๊ฐ ์ด์ ์ ๋
ผ์๋์ง ์์ ๋ฐฉ์์ผ๋ก ๋ถ๋ช
ํ ๋ ๋์ ์ฝ๋๋ก ์ด์ด์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋๋์ต๋๋ค.
๊ทธ๋์ ์ ์ด๋ ํฌ๋ง์ ์์ต๋๋ค. :)
tryhard
์(๋ฅผ) ์๋ํ๋ ์ฌ๋๋ค์ ๊ฒฝ์ฐ ์์ง ์๋ํ์ง ์์๋ค๋ฉด ๋๊ตฌ๊ฐ ๋ณ๊ฒฝํ ์ฌํญ๋ฟ๋ง ์๋๋ผ err != nil
์ ๋๋จธ์ง ์ธ์คํด์ค๋ฅผ grepํ๊ณ ๋ค์์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌด์์ ๋จ๊ฒผ๋์ง, ์.
(๋ํ https://github.com/griesemer/tryhard/์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ PR์ด ์์ต๋๋ค.)
@rsc ๋ ๋ด๊ฐ ๊ฐ์ธ์ ์ผ๋ก defer HandleFunc(&err, ...)
ํจํด์ ์ข์ํ์ง ์๋ ์ด์ ์ ๋ํ ํต์ฐฐ๋ ฅ์
๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ์๋ชธ ๋ฐํ์ด๋ ๋ค๋ฅธ ๊ฒ๊ณผ ์ฐ๊ด์ํค๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ๋๋ฌด "์๋ฆฌํ"๋๋์
๋๋ค.
๋ช ๋ฌ ์ ์(์๋ง๋ 1๋ ?) ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ด ์์์ง๋ง ์ง๊ธ์ ์์ด๋ฒ๋ ธ์ต๋๋ค. ์์ฒญํ ๋ด์ฉ์ ์์ด๋ฒ๋ ธ์ง๋ง ๋๊ตฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์๋ตํ์ต๋๋ค.
func myFunction() (i int, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("wrapping the error: %s", err)
}
}()
// ...
return 0, err
// ...
return someInt, nil
}
์ต์ํ์ผ๋ก ๋งํ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ํฅ๋ฏธ์์๋ค. defer
๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฒ์ ์ฒ์ ๋ณธ ๊ฒ์ด ์ง๊ธ ์ฌ๊ธฐ์ ํ์๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ "์๋ฆฌํ๊ณ " "ํดํค"๋ก ๋ณด๊ณ , ์ ์ด๋ ๋ด๊ฐ ์ ๊ธฐํ ์์์๋ ๋ฐ๋์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ fmt.HandleErrorf
์ ๊ฐ์ ์ ์ ํ ํจ์ ํธ์ถ๋ก ๋ํํ๋ฉด ํจ์ฌ ๊ธฐ๋ถ์ด ์ข์ต๋๋ค. ๊ทธ๋๋ ์์ง๊น์ง๋ ๋ถ์ ์ ์ผ๋ก ์๊ฐํ๊ณ ์์ต๋๋ค.
์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ข์ํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ ๋ ๋ค๋ฅธ ์ด์ ๋ return ..., err
๋ฅผ ์ธ ๋ err
๊ฐ ๋ฐํ๋์ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ๋์ง ์๊ณ ๋์ ๋ณด๋ด๊ธฐ ์ ์ ๊ฐ์ด ์์ ๋ฉ๋๋ค. ์ด์ ์ return
๋ Go์์ ํญ์ "์ ์ฑํ" ์์
์ฒ๋ผ ๋ณด์๊ณ ์ค์ ๋ก ๋ฐํํ๊ธฐ ์ ์ ๋ฐํ๋ ๊ฐ์ ์์ ํ๋ ์ฝ๋๋ฅผ ๊ถ์ฅํ๋ ๊ฒ์ ์๋ชป๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, ์ซ์์ ๋ฐ์ดํฐ์ ๋๋ค. :)
๋ง์ดํฌ๋ก์๋น์ค ํ๋ซํผ์ ์ฌ๋ฌ ์๋น์ค ์์ค์ ๋ํด tryhard๋ฅผ ์คํํ๊ณ loccount ๋ฐ grep 'if err'์ ๊ฒฐ๊ณผ์ ๋น๊ตํ์ต๋๋ค. loccount / grep 'if err' ์ฃผ๋ฌธ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค. | ํ์ฅ์ค / ๋ ธ๋ ฅ:
1382 / 64 / 14
108554 / 66 / 5
58401 / 22 / 5
2052/247/39
12024 / 1655 / 1
์ฐ๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค ์ค ์ผ๋ถ๋ ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ณ ์ผ๋ถ๋ ๊ฑฐ์ ์ํํ์ง ์์ง๋ง ๋ถํํ๊ฒ๋ tryhard๋ ๊ธฐ๊ปํด์ผ 22%์ ๊ฒฝ์ฐ, ์ต์
์ ๊ฒฝ์ฐ 1% ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ์๋ง ์๋์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ ์ ์์์ต๋๋ค. ์ด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ฑํ์ง ์์ ๊ฒ์ด๋ฏ๋ก tryhard์ ๊ฐ์ ๋๊ตฌ๋ ์ฝ๋๋ฒ ์ด์ค์ try()
๋ฅผ ๋์
ํ๋ ๋ฐ ํ์์ ์
๋๋ค. ์ด๊ฒ์ด ๊ฐ๋จํ ์๋น ๋๊ตฌ๋ผ๋ ์ ์ ๋์ด ํ๊ฐํ์ง๋ง ๋์์ด ๋ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค.
๊ทธ๋ฌ๋ ์ง๊ธ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ฌ try()๊ฐ ์ค์ ๋ก ์ด๋ค ๋ฌธ์ ๋ ํด๊ฒฐํ์ง ๋ชปํ๊ฑฐ๋ ์ ์ด๋ tryhard๊ฐ ํจ์ฌ ๋์์ง ๋๊น์ง๋ ํด๊ฒฐ๋์ง ์๋๋ค๊ณ ๋งํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ์ฝ๋ ๊ธฐ๋ฐ์์ $#$ try()
์ if err != nil { return err }
์ฌ์ฉ ์ฌ๋ก๋ ์ผ๋ฐ์ ์ธ go ์ปดํ์ผ๋ฌ์ ๋ฌ๋ฆฌ ์ค์ ๋ก ๋งค์ฐ ๋๋ฌผ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์กด์คํ์ง๋ง, Go ์ปดํ์ผ๋ฌ ์์ค ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ฝ๋ ๊ธฐ๋ฐ๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ๋ณด๋ Go ๋์์ด๋๋ ์ด ๋๋ฌธ์ try()
์ ์ ์ฉ์ฑ์ ๊ณผ๋ ํ๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@beoran tryhard
๋ ํ์ฌ ๋งค์ฐ ์ด๋ณด์ ์
๋๋ค. ์ฝ๋๋ฒ ์ด์ค์์ try
๊ฐ ๋๋ฌธ ์ด์ ์ ๋ํด ์๊ณ ์์ต๋๊น? ์๋ฅผ ๋ค์ด ์ค๋ฅ๋ฅผ ์ฅ์ํ๊ธฐ ๋๋ฌธ์? ๋์๊ฐ๊ธฐ ์ ์ ๋ค๋ฅธ ์ถ๊ฐ ์์
์ ํ๊ธฐ ๋๋ฌธ์? ๋ค๋ฅธ ๊ฒ?
@rsc , @griesemer
์ ๋ฅผ ๋ค์ด tryHard๊ฐ ๋์น ๋ ๊ฐ์ ๋ฐ๋ณต ์ํ์ ์ฌ๊ธฐ ์ ์ ๊ณตํ์ต๋๋ค. ํ๋๋ "if Err :="๋ก ์ ์ง๋๊ณ ๋ค๋ฅธ ํ๋๋ ํด๊ฒฐ ๋ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฅ์ ์ ๊ฒฝ์ฐ ์ฝ๋์์ ๋ณผ ์ ์๋ ๋ ๊ฐ์ง ๋ฐ๋ณต ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(ํ๋์ ์ฝ๋ ์กฐ๊ฐ์ ๋ ๊ฐ์ง๋ฅผ ๋ฃ์์ต๋๋ค).
if v, err := someFunction(vars...) ; err != nil {
return fmt.Errorf("extra data to help with where did error occur and params are %s , %d , err : %v",
strParam, intParam, err)
} else if v2, err := passToAnotherFunc(v,vars ...);err != nil {
extraData := DoSomethingAccordingTo(v2,err)
return formatError(err,extraData)
} else {
}
๊ทธ๋ฆฌ๊ณ formatError๊ฐ ์ฑ์ ํ์ค์ด๊ฑฐ๋ ๊ต์ฐจ ์ ์ฅ์์ธ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ฉฐ, ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ณต๋๋ ๊ฒ์ DbError ํ์ ์ง์ (๋ชจ๋ ์ฑ/์ฑ์ ํ ๊ธฐ๋ฅ, ์์ญ ๊ฐ์ ์์น์์ ์ฌ์ฉ๋จ)์ ๋๋ค. ์ฌ๋ฐ๋ฅธ ํจํด") ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ์ ์ ์ฅํ๊ณ (์คํ์ ๋๊ธฐ๊ณ ์ถ์ง ์์ SQL ์ฟผ๋ฆฌ ์คํจ) ์ค๋ฅ์ ๋ค๋ฅธ ํ ์คํธ๋ฅผ ์ ์ฅํฉ๋๋ค.
๋ค์ ๋งํด์, "์ค๋ฅ A ๋ก๊น
๋ฐ ์ค๋ฅ B ๋ฐ์๊ณผ ๊ฐ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ก ์ค๋งํธํ ์์
์ ์ํ ํ๋ ค๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ์ฅํ๋ ์ด ๋ ๊ฐ์ง ์ต์
์ ๋ํ ์ธ๊ธ ์ธ์๋
์ด๊ฒ์ "์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ '๋ค๋ฅธ ์ฌ๋'์ด๋ '๋ค๋ฅธ ๊ธฐ๋ฅ'์ด ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ ์ด์"์ ๋ํ ๋ ๋ค๋ฅธ ์ต์
์
๋๋ค.
์ฆ, "์คํ ํ๋ก๊ทธ๋จ"๋ณด๋ค "๋ผ์ด๋ธ๋ฌ๋ฆฌ"์ try()๊ฐ ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ์๋ง๋ ์คํ ๊ฐ๋ฅ ํ์ผ("์ฑ")๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ๋ณํ๋ Total/Errs/tryHard ๋น๊ต๋ฅผ ์คํํ๋ ค๊ณ ํ ๊ฒ์ ๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -503297387์ ์ค๋ช
๋ ์ํฉ์ ์ ํํ ์ฒํ์ต๋๋ค.
์ด๋ค ์์ค์์๋ ์ค๋ฅ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ํํฉ๋๋ค try
๋ก ๋ณ๊ฒฝํ์ง ์๊ฒ ์ต๋๋ค. if err!=nil
๋ก ๊ด์ฐฎ์ต๋๋ค.
๋ค๋ฅธ ์์ค์์๋ return err
๋ชจ๋ ๋ฐํ์ ๋ํด ๋์ผํ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ณ ํต์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด try
๋ฐ defer
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ ๋๋นํ์ฌ ๊ธฐ๋ฅ ์์ ์ ์ฌ์ฉํ๋ ํน์ ๋ก๊ฑฐ๋ก ์ด๋ฏธ ์ด ์์
์ ์ํํฉ๋๋ค. ์ ์๊ฒ try
์ ๊ธฐ๋ฅ๋ณ ์ฅ์์ ์ด๋ฏธ ์ด์ค๋ฝ์ต๋๋ค.
@thepudds
try
๊ฐ Go 1.15์ ๊ฐ์ ๊ฒ์ ๊ฐ์์ ์ผ๋ก ์ฐฉ๋ฅํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋งค์ฐ ์งง์ ๋๋ต์ ๋๊ตฐ๊ฐ Go 1.13์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
์์ง Go 1.13์ด ์ถ์๋์ง ์์์ ์ฌ์ฉ์ ๋ชปํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด ํ๋ก์ ํธ์์ Go ๋ชจ๋์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ Go 1.13์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค. (์ ๋ Go 1.13์์ ๋ชจ๋ ์ฌ๋์ด Go ๋ชจ๋์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
try
๋ก ์ฝ๋๋ฅผ ๋น๋ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค..\hello.go:3:16: undefined: try note: module requires Go 1.15
(์ ์ด๋ ๋ด๊ฐ ์ ํ ์ ์์ ๋ํด ์ธ๊ธํ ๋ด์ฉ์ ์ดํดํ๋ ํ).
๊ทธ๊ฒ์ ๋ชจ๋ ๊ฐ์ค์ ๋๋ค. ์ ๊ฐ ํ๊ตฌ์ ์ธ ๊ฒ์ ๋ํด ๋ ผํํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค๋ฅ๊ฐ ๋ง์์ ๋ค ์๋ ์์ง๋ง ํผ๋์ค๋ฝ๊ณ ๋์์ด ๋์ง ์์ต๋๋ค.
try๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ grepํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์๋ฌด๊ฒ๋ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๊ทธ๋ฆฌ๊ณ note: module requires Go 1.15
๋ ์ด ์ํฉ์์ ์ต์
์ ๋์์
๋๋ค. ์ module
์
๋๊น? ์ Go 1.15
์
๋๊น?
@griesemer
์ด๊ฒ์ ์๋ง๋ ๋ ์ค์ง์ ์ธ ๋ฐฉ์์ผ๋ก ์ธ์ด์ ๋๋์ ์ํฅ์ ๋ฏธ์น๋ ์ต์ด์ ์ ์๋ ์ธ์ด ๋ณ๊ฒฝ์ผ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ต์ํํ์ต๋๋ค. (๋๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ค๋ฆญ ์ ์์ด ์ผ์ผํฌ ์ ์๋ ์๋์ ์์ํ๊ธฐ ์ด๋ ต๋ค - ์ธ์ด ๋ณ๊ฒฝ์ ๋ํด ์ด์ผ๊ธฐํ๋ค).
์ฐจ๋ผ๋ฆฌ ์ ๋ค๋ฆญ์ ์๊ฐ์ ํ ์ ํ๊ณ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Go์ ์ ๋ค๋ฆญ์ด ์์ผ๋ฉด ์ด์ ์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์์ ์ผ๋ก ๋์๊ฐ์: ํ๋ก๊ทธ๋๋จธ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋ํ๊ณ ๋๋ผ๋ ๋ฐฉ์์ ์ต์ํด์ง๋๋ค. ...
๋๋ ๋น์ ์ ๋ชจ๋ ์์ ์ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ if ๋ฌธ์ ํน์ ํ์์ try ํจ์ ํธ์ถ๋ก ๋์ฒดํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์์ฑ๊ณผ ์ง๊ต์ฑ์ ์๋ํ๋ ์ธ์ด์ ๋๋ค. ๋๋ ๋ชจ๋ ๊ฒ์ ์ต์ํด์ง ์ ์์ง๋ง, ๊ทธ๊ฒ ๋ฌด์จ ์์ฉ์ธ๊ฐ? ๋ช ์ค์ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ค๋ฉด?
๋๋ ๋ค์ ์ฌ๊ณ ์คํ์ ๊ณ ๋ คํ์ญ์์ค. Imagine Go์๋
defer
๋ฌธ์ด ์์๊ณ ์ด์ ๋๊ตฐ๊ฐdefer
์ ๋ํ ๊ฐ๋ ฅํ ์ฌ๋ก๋ฅผ ๋ง๋ญ๋๋ค.defer
์๋ ์ธ์ด์ ๋ค๋ฅธ ๊ฒ๊ณผ ๊ฐ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ์ธ์ด๋ ๋ ์ด์defer
์ด์ ์ฒ๋ผ ๋๊ปด์ง์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ 10๋ ๋์ ํจ๊ป ์ด์๋ณด๋ ์์ ํ "๋ฐ๋"์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ช ๋
์ด ์ง๋ ํ์๋ ์ฌ์ ํ defer
๋ณธ๋ฌธ์ ์์ ๋ณ์์ ๋ํด ๋ซํ ์์ต๋๋ค. ๊ทธ๋ฌ๋ defer
๋ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๊ด๋ จํ์ฌ ์คํ์ด๋์ ๊ทธ ๋๊ฐ๋ฅผ ์ง๋ถํฉ๋๋ค. defer
์๋ Go๋ ์์ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋ ์๋ฌด๋ฐ ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์ try
์ ๋ํด ๋น์ทํ ๊ฐ๊ฒฉ์ ์ง๋ถํ ์ค๋น๊ฐ ๋์ด ์์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ๋๋ค์๊ฒ ์์ ์ ์ฝ๋์์ ์คํ์ ํตํด ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ฐธ์ฌํ๋๋ก ์์ฒญํ๋ ์ด์ ์ ๋๋ค. ์ฆ, ์ค์ ๋ก ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ
tryhard
์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋๋ ๊ทธ๊ฒ์ ์ ์ ๋์, ์๋ง๋ ์ผ์ฃผ์ผ ์ ๋ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์๋ณด๊ณ ๋ค์๋ณด๊ณ ํ์ญ์์ค.
๋ด ์์ ํ๋ก์ ํธ(์ฝ 1200์ค์ ์ฝ๋)๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ์ต๋๋ค. https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์ ์ฌํด ๋ณด์ ๋๋ค. ์ ์๊ฒฌ์ด ๋ณด์ด์ง ์์ต๋๋ค. ์ผ์ฃผ์ผ ํ์ ์ด๊ฒ์ ๋ํด ๋ณ๊ฒฝํ์ญ์์ค. ๋ด ๋ง์์ ํญ์ ๋ฌด์ธ๊ฐ๋ก ๊ฐ๋ ์ฐจ ์๊ณ ์์ด ๋ฒ๋ฆด ๊ฒ์ ๋๋ค.
...์์ง ์ด๋ฅด์ง๋ง ์ด ์ ์์ด ๋์จ์ง 2์ฃผ๋ฐ์ ์๋๋๋ฐ...
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ด ์ค๋ ๋์ ์ด ์ ์์ ๋ํ 504๊ฐ์ ๋ฉ์์ง๊ฐ ์์์ ์ ์ ์์ต๋๋ค. ์ด ๋ณํ๋ฅผ ์ถ์งํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ ์ฝ๊ณ ์ดํดํ๋ ๋ฐ ๋ช ์ฃผ๊ฐ ์๋๋ผ ๋ฉฐ์น ์ด ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค. ๋๋ ๋น์ ์ ์ง์ ์ด ๋ถ๋ฌ์ํ์ง ์์ต๋๋ค.
์๊ฐ์ ๋ด์ด ๋ด ๋ฉ์์ง์ ๋ต์ฅํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฃ์กํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋ต์ฅ์ ๋ณด๋ด์ง ์์ผ๋ฉด ๋ฉ์์ง๊ฐ ๋์๊ฒ ์ ๋ฌ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ธฐ์๋ ๋๋ฌด ํฝ๋๋ค.
์๋ ์ค
@griesemer ๋ฉ์ง ์ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. tryhard๋ ์ ๊ฐ ๊ธฐ๋ํ๋ ๊ฒ๋ณด๋ค ๋ ์ ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ํ ๊ฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
@rsc ์ ์ค๋ช ๋ ์๋ต๊ณผ ๋๊ตฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ํ๋์ ์ด ์ค๋ ๋๋ฅผ ํ๋ก์ฐํ๋๋ฐ @beoran์ ๋ค์ ๋๊ธ์ ์ ์๊ฒ ์ค์นํจ ์ ์ค๋๋ค.
์ค๋ฅ ๋ณ์์ ๋ฐํ์ ์จ๊ธฐ๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
์ ์ ์ฌ๋ฌ bad written code
๋ฅผ ๊ด๋ฆฌํ ์ ์ด ์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ์ต์
์ ์
๋ชฝ์ด๋ผ๊ณ ์ฆ์ธํ ์ ์์ต๋๋ค.
๋ฌธ์์ A
likes๋ฅผ ์ฌ์ฉํ๋๋ก ๋ช
์๋์ด ์๋ค๊ณ ํด์ ์ด๋ฅผ ๋ฐ๋ฅผ ๊ฒ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋ฉฐ AA
, AB
๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋ฐฉ๋ฒ์๋ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
To my surprise, people already think the code below is cool
... it's an abomination
๋ ๊ธฐ๋ถ์ด ์ํ ์ฌ๋์๊ฒ ์ฌ๊ณผ๋ฅผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
AsCommit
๋ฅผ ํ์ธํ๊ณ ๋ค์์ ๋ณผ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ญ์์ค.
func AsCommit() error(){
return try(try(try(tail()).find()).auth())
}
๊ด๊ธฐ๋ ๊ณ์๋๊ณ ์์งํ ๋๋ ์ด๊ฒ์ด @robpike simplicity is complicated
(์ ๋จธ)์ ์ ์๋ผ๊ณ ๋ฏฟ๊ณ ์ถ์ง ์์ต๋๋ค.
@rsc ์์ ๊ธฐ๋ฐ
// Example 1
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// Example 2
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// Example 3
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
์ฝ๊ฐ์ else
๊ฐ ์๋ Example 2
์ ์ฐฌ์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ต์ ์ ์ ๊ทผ ๋ฐฉ์์ ์๋ ์๋ ์์ต๋๋ค.
abomination
๋ก ๋ณ์ดํ ์ ์๋ ์ต์try
๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ์๋ํ์ง ์์ต๋๋ค. ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฑฐ์ ์์ต๋๋ค. go
๋ if
๋ฅผ ์ฌ์ฉํ๊ณ try tree := r.LookupTree(treeOid) else {
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ ์์ฐ์ค๋ฌ์์ง๋๋ค.try
& catch
๋ฅผ ์ง์ํ์ง ์๋ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid) else {
// Heal the world
// I may return with return keyword
// I may not return but set some values to 0
// I may remember I need to log only this
// I may send a mail to let the cute monkeys know the server is on fire
}
์กฐ๊ธ ์ด๊ธฐ์ ์ธ ๋ง์์ ๋๋ฆฐ ์ ๋ค์ ํ ๋ฒ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
@josharian ์ฌ๊ธฐ์ ๋๋ฌด ๋ง์ด ๋ฐํ ์๋ ์์ง๋ง ๊ทธ ์ด์ ๋ ๋งค์ฐ ๋ค์ํฉ๋๋ค. ๋น์ ์ด ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์ค๋ฅ๋ฅผ ์ฅ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉฐ ๋ํ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ ํจ์๊ฐ ๋ฐํํ ์ ์๋ ๊ฐ ์ค๋ฅ์ ๋ํด ๋ก๊ทธ ๋ฉ์์ง๊ฐ ๋ค๋ฅธ ๊ณณ์์ ๋๋ if err := foo() ; err != nil { /* various handling*/ ; return err }
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๋ค๋ ๊ฒ์
๋๋ค.
๊ฐ์กฐํ๊ณ ์ถ์ ๊ฒ์ try()
๊ฐ ์ค๊ณ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ฐ๋ฆฌ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋งค์ฐ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ธ์ด์ 'try()'๋ฅผ ์ถ๊ฐํ๋ฉด ์ป์ ์ ์๋ ๊ฒ์ด ๋ง์ง ์์ต๋๋ค.
ํธ์ง: try()๊ฐ ๊ตฌํ๋ ์์ ์ด๋ผ๋ฉด ๋ค์ ๋จ๊ณ๋ tryhard๋ฅผ ํจ์ฌ ๋ ๊ฐ์ ํ์ฌ ๊ธฐ์กด ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@griesemer ๊ทํ์ ๋ง์ง๋ง ๋ต๋ณ ๋ถํฐ ๊ทํ์ ๋ชจ๋ ์ฐ๋ ค ์ฌํญ์ ํ๋์ฉ ํด๊ฒฐํ๋๋ก ๋
ธ๋ ฅํ๊ฒ ์ต๋๋ค.
๋จผ์ ํธ๋ค๋ฌ๊ฐ ์ด๋ค ์์ผ๋ก๋ ํจ์๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ข
๋ฃํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์ง ๋ฌผ์์ต๋๋ค. ์, emit
/ handle
์ ์ด ํจ์๋ฅผ ๋ฐํํ๊ฑฐ๋ ์ข
๋ฃํ์ง ์๊ณ ์ค๋จ๋ ๋ถ๋ถ์ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ตฌ๋ถ ๊ธฐํธ๋ ํ๋
๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๊ฒ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ EOF
์ ๋๋ฌํ๋ฉด ํด๋น ํญ๋ชฉ์ ๋๋ฌํ์ ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ ์ถ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
func findDelimiter(r io.Reader) ([]byte, error) {
emit err {
// if this doesn't return then continue from where we left off
// at the try function that was called last.
if err != io.EOF {
return nil, err
}
}
bufReader := bufio.NewReader(r)
token := try(bufReader.ReadSlice('|'))
return token, nil
}
๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋จ์ํํ ์๋ ์์ต๋๋ค.
func findDelimiter(r io.Reader) ([]byte, error) {
emit err != io.EOF {
return nil, err
}
bufReader := bufio.NewReader(r)
token := try(bufReader.ReadSlice('|'))
return token, nil
}
๋ ๋ฒ์งธ ์ฐ๋ ค๋ ์ ์ด ํ๋ฆ์ ์ค๋จ์ ๋ํ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ๊ทธ๊ฒ์ ํ๋ฆ์ ๋ฐฉํดํ ๊ฒ์ด์ง๋ง ๊ณต์ ํ๊ฒ ๋งํ๋ฉด ๋๋ถ๋ถ์ ์ ์์ ํ๋์ ์ค์ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ๋ฑ์ ๊ฐ๋๋ก ํ๋ฆ์ ๋ค์ ๋ฐฉํดํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ๋ฏฟ๋ ๊ฒ๊ณผ ๋ค๋ฅด์ง ์์ต๋๋ค.
๋ค์์ผ๋ก emit
/ handle
๋ฅผ ๋ ๋ฒ ์ด์ ์ฌ์ฉํ๋์ง์ ๋ํด ์ง๋ฌธํ๋๋ฐ ์ฌ์ ์๋์๋ค๊ณ ํฉ๋๋ค.
emit
๋ฅผ ๋ ๋ฒ ์ด์ ์ฌ์ฉํ๋ฉด ๋ง์ง๋ง ํญ๋ชฉ์ ๋ฎ์ด์ฐ๋ ์์ผ๋ก ๊ณ์๋ฉ๋๋ค. ์๋ ๊ฒฝ์ฐ try
์๋ nil ๊ฐ๊ณผ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ธฐ๋ณธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ต๋๋ค. ์ฆ, ์ด ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func writeStuff(filename string) (io.ReadCloser, error) {
emit err {
return nil, err
}
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
์ด ์์ ์ ๋์ผํ ์์ ์ ์ํํฉ๋๋ค.
func writeStuff(filename string) (io.ReadCloser, error) {
// when not defining a handler then try's default handler kicks in to
// return nil valued then error as usual.
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
๋ง์ง๋ง ์ง๋ฌธ์ error
์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ ํ์ฌ defer
์์ ํธ์ถ๋๋ ํธ๋ค๋ฌ ํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค. ์ด ์ค๊ณ๋ defer
๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด ์์ฒด์์ ํจ์๋ฅผ ์ฆ์ ์ค์งํ ์ ์๋ค๋ ๊ทผ๊ฑฐ์์ ์ด ์ ์์ด ์๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์์ต๋๋ค.
๋๋ ๋น์ ์ ์๋ต์์ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ์๋ค๊ณ ๋ฏฟ์ผ๋ฉฐ ์ด๊ฒ์ด ๋ด ์ ์์ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ํด์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ ์ด์ ์ฐ๋ ค ์ฌํญ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ๋ชจ๋ ์ฌ๋๊ณผ์ ์ด ์ ์ฒด ํ ๋ก ์ ์๋ก์ด ์์ด๋์ด๋ฅผ ์๊ณ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ฌ๋ฏธ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ ๋ฉ์ง ์์ ์ ๊ณ์ํ์ญ์์ค!
@velovix , ๋ค์ https://github.com/golang/go/issues/32437#issuecomment -503314834:
๋ค์ ๋งํ์ง๋ง, ์ด๋
try
๊ฐ ์ค๋ฅ์ ๋ํ ๋ฐ์์ ๊ฐ์กฐํ์ง๋ง ์ค๋ฅ์ ๋ํ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๋์ ์๋ฏธํฉ๋๋ค. ๊ทธ๊ฒ์ ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์์ํ๋ ๊ตฌ๋ณ์ ๋๋ค. ํจ์๊ฐ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ ๋ ์์๊ฒ ํน๋ณํ ๊ด์ฌ์ ๋์ง ์์ง๋ง ํจ์๊ฐ ์ค๋ฅ์ ๋ฐ์ํ๋ ๋ฐฉ์์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋์ ๋ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ๋ ์ฅํฉํ๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ดtry
๊ฐ ํ๋ ์ผ์ ๋๋ค.
์ด๊ฒ์ ๊ทธ๊ฒ์ ๋ฃ๋ ์ ๋ง ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์.
@olekukonko , ๋ค์ https://github.com/golang/go/issues/32437#issuecomment -503508478:
To my surprise, people already think the code below is cool
...it's an abomination
๋ ๊ธฐ๋ถ์ด ์ํ ์ฌ๋์๊ฒ ์ฌ๊ณผ๋ฅผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()) parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
Grepping https://swtch.com/try.html , ํด๋น ํํ์์ ์ด ์ค๋ ๋์์ ์ธ ๋ฒ ๋ฐ์ํ์ต๋๋ค.
@goodwine ์ด ๊ทธ๊ฒ์ ๋์ ์ฝ๋๋ก ๋ด์ธ์ ๊ณ , ๋๋ ๋์ํ๊ณ @velovix ๋ "๊ทธ๊ฒ์ด ์ถํจ์๋ ๋ถ๊ตฌํ๊ณ ... ๋น์ ์ด try-catch ์ธ์ด์์ ์์ฃผ ๋ณด๋ ๊ฒ๋ณด๋ค ๋ซ๋ค ... ์ฌ์ ํ ์ฝ๋์ ์ด๋ค ๋ถ๋ถ์ด ์ฐํํ ์ ์๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ก ์ธํด ํ๋ฆ์ ์ ์ดํ ์ ์์ต๋๋ค."
์๋ฌด๋ ๊ทธ๊ฒ์ด "๋ฉ์๋ค"๊ฑฐ๋ ํ๋ฅญํ ์ฝ๋๋ก ๋ด์ธ์ธ ๋งํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ํญ์ ์๋ชป๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค .
๋๋ ๋ํ ๋จ์ง ๋ค์ ๋งํ ๊ฒ์ ๋๋ค
์ค๋ฅ๋ ๋งค์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ผ๋ฉฐ ๊ฐ๋ฅํ ํ ๋ง์ ๊ฐ์์ฑ์ด ํ์ํฉ๋๋ค.
Go์ ์ค๋ฅ๋ ๋น์ฉ์ด ๋ง์ด ๋ค์ง ์์ต๋๋ค. ์ผ์์ ์ด๊ณ ์ผ์์ ์ธ ์ผ์ด๋ฉฐ ๊ฒฝ๋์ ๋๋ค. (์ด๋ ํนํ ์์ธ์ ์ผ๋ถ ๊ตฌํ๊ณผ ๋์กฐ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฃจํ์์ ์๋ ค์ง ๋ชฉ๋ก์ ํ์ธํ๋ ๋ฃจํ์์ ์คํจํ "ํ์ผ ์ด๊ธฐ" ํธ์ถ์ ๋ํ ์คํ ์ถ์ ์ ํฌํจํ๋ ์์ธ ๊ฐ์ฒด๋ฅผ ์ค๋นํ๊ณ ํ๊ธฐํ๋ ๋ฐ ๋๋ฌด ๋ง์ CPU ์๊ฐ์ ์๋นํ ์๋ฒ๊ฐ ์์์ต๋๋ค. ์ฃผ์ด์ง ํ์ผ์ ์์น.)
@alexbrainman , ์ด์ ๋ฒ์ ์ Go์์ try๊ฐ ํฌํจ๋ ์ฝ๋๋ฅผ ๋น๋ํ๋ฉด ์ด๋ป๊ฒ ๋๋์ง ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค. ์งง์ ๋๋ต์ ์ฐ๋ฆฌ๊ฐ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ๋์ ๋น์ทํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ ์ปดํ์ผ๋ฌ๋ ๋๋ถ๋ถ ๋์์ด ๋์ง ์๋ ๋ฉ์์ง(์ด ๊ฒฝ์ฐ "undefined: try")์ ํจ๊ป ์ ์ฝ๋๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ์ด์ ์ปดํ์ผ๋ฌ๊ฐ ์ ๊ตฌ๋ฌธ์ ๋ํด ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ ๋์์ด ๋์ง ์์ผ๋ฉฐ ์ค์ ๋ก ๋ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ทธ ์์ ์์ ์ฌ๋๋ค์ "์ ์๋์ง ์์ ์๋"์ ๋ํ ์น ๊ฒ์์ ์ํํ๊ณ ์ ๊ธฐ๋ฅ์ ๋ํด ์์๋ผ ๊ฒ์ ๋๋ค.
@thepudds ์ ์์์ try ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์๋ 'go 1.15' ํ์ด ํฌํจ๋ go.mod๊ฐ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ์์ฑ์๊ฐ ์ฝ๋๊ฐ Go ์ธ์ด ๋ฒ์ ์ ๋ํด ์์ฑ๋์์์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ์๋ง๋ ๋์์ด ๋์ง ์๋ ๋ฉ์์ง๊ฐ ๋๋ฌด ์ค๋๋ Go ๋ฒ์ ์ผ๋ก ์ธํ ๊ฒ์์ ์ปดํ์ผ ์ค๋ฅ ํ์ ์ ์ํ๋ ์ด์ go ๋ช ๋ น์ ๋ํ ์ ํธ ์ญํ ์ ํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ์น ๊ฒ์์ ์์กดํ์ง ์๊ณ ๋ฉ์์ง๋ฅผ ์กฐ๊ธ ๋ ์ ์ฉํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ช ์์ ์ธ ์๋์ ๋๋ค. ๋์์ด ๋๋ค๋ฉด ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์น ๊ฒ์์ ์ด์จ๋ ๋งค์ฐ ํจ๊ณผ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@guybrand , re https://github.com/golang/go/issues/32437#issuecomment -503287670 ๊ทธ๋ฆฌ๊ณ ๋ฐ์ ์ ๋๋ฌด ๋ฆ์ ์ ์์ด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๊ฐ ์๋ ์ ํ์ ๋ฐํํ๋ ํจ์์ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ก์ ๋ณํ์ด nil-ness๋ฅผ ์ ์งํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ง์ *MyError ๊ตฌ์ฒด์ ์ธ ์ ํ(์: ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ)์ด ์๊ณ err == nil์ ์ฑ๊ณต ์ ํธ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
func f() (int, *MyError)
func g() (int, error) { x, err := f(); return x, err }
f๊ฐ nil *MyError๋ฅผ ๋ฐํํ๋ฉด g๋ nil์ด ์๋ ์ค๋ฅ์ ๋์ผํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ์๋ํ ๊ฒ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค. *MyError๊ฐ ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ๋์ ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ ๋ณํ์ nilness๋ฅผ ์ ์งํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ฏธ๋ฌํฉ๋๋ค.
try์ ๊ฒฝ์ฐ try๊ฐ nil์ด ์๋ ๊ฐ์ ๋ํด์๋ง ํธ๋ฆฌ๊ฑฐ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, f๊ฐ ์คํจํ ๋ nil์ด ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํ ์ค์ ๋ก ๊ด์ฐฎ๊ณ f๊ฐ ์ฑ๊ณตํ์ ๋ nil ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํ ๊ด์ฐฎ์ต๋๋ค.
func g() (int, error) {
return try(f()), nil
}
๊ทธ๋์ ๊ทธ๊ฒ์ ์ค์ ๋ก ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ๋น์ ์ ์ด๊ฒ์ ๋ณด๊ณ ๊ทธ๊ฒ์
func g() (int, error) {
return f()
}
๊ฐ์์ผ ํ ๊ฒ ๊ฐ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
์ค์ ๊ฒฝํ์์ ์ ์คํ ๊ฒํ ์ ํ๊ฐ๊ฐ ํ์ํ ์๋ ์ ์์ ๋ค๋ฅธ ์ธ๋ถ ์ฌํญ์ด ์ถฉ๋ถํ ์์ผ๋ฏ๋ก ์ด ํน์ ๋ฏธ๋ฌํจ์ ๋ํด ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฐ๊ธฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ง๊ธ๊น์ง ๋ชจ๋ ํผ๋๋ฐฑ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด ์์ ์์ ์ฐ๋ฆฌ๋ try
์ ์ฃผ์ ์ด์ , ์ฐ๋ ค, ๊ฐ๋ฅํ ์ข์ ์ํฅ๊ณผ ๋์ ์ํฅ์ ์๋ณํ ๊ฒ ๊ฐ์ต๋๋ค. ์งํํ๋ ค๋ฉด try
๊ฐ ์ค์ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ํด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์กฐ์ฌํ์ฌ ์ถ๊ฐ๋ก ํ๊ฐํด์ผ ํฉ๋๋ค. ์ด ์์ ์์ ๋
ผ์๋ ๊ฐ์ ์ ์ ๋น๋น ๋๋ฉฐ ๋ฐ๋ณตํ๊ณ ์์ต๋๋ค.
๊ฒฝํ์ ์ด์ ๊ณ์๋๋ ํ ๋ก ๋ณด๋ค ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ์์ ์ ์ฝ๋ ๊ธฐ๋ฐ์์ try
๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์คํ ํ๊ณ ํผ๋๋ฐฑ ํ์ด์ง์ ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์๊ฐ์ ๊ฐ๋๋ก ๊ถ์ฅํฉ๋๋ค.
๋ชจ๋์๊ฒ ์จ์ ๊ณ ๋ฅด๊ณ ์คํํ ์๊ฐ์ ์ฃผ๊ธฐ ์ํด ์ด ๋ํ๋ฅผ ์ผ์ ์ค์งํ๊ณ ๋ค์ ์ฃผ ๋ฐ ๋์ ๋ฌธ์ ๋ฅผ ์ ๊ธ๋๋ค.
์ ๊ธ์ 1p PDT/4p EDT(์ง๊ธ๋ถํฐ ์ฝ 3์๊ฐ ํ)์ ์์๋์ด ์ฌ๋๋ค์ด ๋ณด๋ฅ ์ค์ธ ๊ฒ์๋ฌผ์ ์ ์ถํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. 7์ 1์ผ์ ๋ ๋ง์ ๋ ผ์๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ๊ฒ์ ๋๋ค.
์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ์ ์ดํดํ๊ณ ์ค์ ์ฝ๋์์ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์๊ฐ์ ๋ค์ด์ง ์๊ณ ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ์๋๋ฅผ ์๊ฐ์ด ์์์ ์์ฌํ์ญ์์ค. ์ฐ๋ฆฌ๋ ๊ณผ๊ฑฐ์ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ ์ด๊ฒ์ ๋ฐ๋ก์ก๋ ๋ฐ ํ์ํ ์๊ฐ์ ํ ์ ํ ๊ฒ์ ๋๋ค.
๊ทธ ์ํค ํ์ด์ง๋ ํ์ธ/์ฒ๋ฆฌ์ ๋ํ ์๋ต์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ์ ํ์ด์ง๋ฅผ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์จ๋ ๋๋ ์ํค์์ ์ ์ ๊ฐ๊พธ๊ธฐ๋ฅผ ๊ณ์ํ ์๊ฐ์ด ์์ ๊ฒ์ ๋๋ค.
@networkimprov , ์ ์ ๊ฐ๊พธ๊ธฐ์ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback์ ์๋ก์ด ์๋จ ์น์ ์ ๋ง๋ค์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์์ ํ ์๋ก์ด ํ์ด์ง๋ณด๋ค ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฝ์ ๋ํ ๋ก๋ฒํธ์ 1p PDT / 4p EDT ๋ ธํธ๋ ๋์ณ์ ์กฐ๊ธ ์ด๋ฅธ ์๊ฐ์ ์ ๊ทธ๊ฒ ๋์์ต๋๋ค. ์กฐ๊ธ ๋ ์ค๋, ๋ค์ ์คํํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ธ ๊ณํ์ด์๊ณ , ๊ทธ๊ฒ์ด ์ ๊ฒจ ์๊ธฐ ์ ์ ์๋ฃํ๊ณ ์ถ์์ต๋๋ค.
๋ฐ๋ํ์ด ๋นํ์ ๋ณด์ง ์๊ณ ๋ค์์ ์ ์๋ฅผ ๋ฐ์ํ๋ค๊ณ ๋๋ผ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฑ์ ์์์๊ฐ ๋ํ๋ฅผ ์๋ํ๋ ๊ฒฝํฅ์ด ํญ์ ์๊ณ , ๊ทธ๋ฐ ์ผ์ด ์ฌ๊ธฐ์์ ์ผ์ด๋ฌ์ ์๋ ์๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ๋ชจ๋ ์ฌ๋๋ค์ด ์ ์ ์ ํ๊ณ ์์ ๋ ์ ์์ ๋ํด ์๋ ๊ทธ๋๋ก ์ด์ผ๊ธฐํ๊ณ ์ถ์ดํ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋๋ด์ํต๋๋ค.
๊ทธ๋์ - ๋๋ ๊ทธ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ ๊ฒ์ ๋ํ ๋์ ๊ธ์ ์ ์ธ ์ ์ฅ์ ๋ถ๋ช ํ ํ๊ณ ์ถ์ต๋๋ค.
์คํ ์ถ์ ์ ๋ฑ์ด๋ด๋ ๊ฒฝ์ฐ์๋ ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๊ณ ์ฃผ์์ ๋ฌ๊ธฐ ์ํด ์ด๋ฏธ defer๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ด์ ์ ๋๋ค.
๋ณด๋ค:
https://github.com/ugorji/go-ndb/blob/master/ndb/ndb.go#L331
https://github.com/ugorji/go-serverapp/blob/master/app/baseapp.go#L129
https://github.com/ugorji/go-serverapp/blob/master/app/webrouter.go#L180
๋ชจ๋ errorutil.OnError(*error)๋ฅผ ํธ์ถํฉ๋๋ค.
https://github.com/ugorji/go-common/blob/master/errorutil/errors.go#L193
์ด๊ฒ์ Russ/Robert๊ฐ ์์ ์ธ๊ธํ ์ง์ฐ ๋์ฐ๋ฏธ์ ๋ผ์ธ์ ๋ฐ๋ฆ ๋๋ค.
FWIW์์ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ํจํด์ ๋๋ค. ๋ง๋ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ์์ ํ go-like IMHO์ ๋๋ค.
๋ํ ๋ช ๋ช ๋ ๋งค๊ฐ๋ณ์์ ํจ๊ป ์ฌ์ฉํ๋ฉฐ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค.
๋๋ ์ฌ๊ธฐ์์ ๊ถ์ฅ๋๋ ๋ชจ๋ ๊ฒ์ด ๋ง๋ฒ์ด๋ผ๋ ๊ฐ๋ ์ ์ด์๋ฅผ ์ ๊ธฐํ๊ธฐ ์ํด ์ด๋ ๊ฒ ๋งํฉ๋๋ค.
๋์งธ, ํจ์๋ก try(...)์ ๋ช ๊ฐ์ง ์ฃผ์์ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค.
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฅํ ์ ์๋ค๋ ์ ์์ ํค์๋๋ณด๋ค ํ ๊ฐ์ง ๋ถ๋ช
ํ ์ด์ ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ ผ์๋ 2๊ฐ์ง ํ์ฅ ๋ชจ๋๊ฐ ์์ต๋๋ค.
๊ทธ๋ค ๊ฐ๊ฐ์ ๋ํด ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ทจํ๋ ํจ์๋ก ์๋ํ๋ ๊ฒ์ด ํ์ํ๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ๋์ค์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ฅผ ์ทจํ๋๋ก ํ์ฅ๋ ์ ์์ต๋๋ค.
์ฐ์ฅ ์๋๊ฐ ํ์ํ์ง, ํ์ํ๋ค๋ฉด ์ด๋ค ๋ฐฉํฅ์ผ๋ก ๊ฐ์ผ ํ ์ง๋ ์์ง ๊ฒฐ์ ๋์ง ์์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ๋ฐฉํฅ์ ๋ด๊ฐ ์์ํ ์ซ์ดํ์ง๋ง ๊ณ์ํด์ ๋น์ฆ๋์ค๋ฅผ ์ํํ๋ ๋น์ฉ์ผ๋ก ์๊ฐํ๋ "if err != nil { return err }" ๋ง๋๋ฌ์ ๋๋ถ๋ถ ์ ๊ฑฐํ๊ธฐ ์ํ ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก try ๊ฐ ์ธ๋ผ์ธ์ผ๋ก ํธ์ถํ ์ ์๋ ํจ์๋ผ๋ ์ ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
var u User = db.loadUser(try(strconv.Atoi(stringId)))
AS ๋ฐ๋:
var id int // i have to define this on its own if err is already defined in an enclosing block
id, err = strconv.Atoi(stringId)
if err != nil {
return
}
var u User = db.loadUser(id)
๋ณด์๋ค์ํผ, ์ ๋ 6์ค์ 1์ค๋ก ์ค์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค 5์ค์ ์ง์ ํ ์์ฉ๊ตฌ์
๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ์ฌ๋ฌ ๋ฒ ๋ค๋ฃจ์์ผ๋ฉฐ ๋ง์ go ์ฝ๋์ ํจํค์ง๋ฅผ ์์ฑํ์ต๋๋ค. ๋ด github์์ ๋ด๊ฐ ์จ๋ผ์ธ์ ๊ฒ์ํ ์ผ๋ถ ๋๋ go-codec ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฌ๊ธฐ์ ์๋ ๋ง์ ์๊ฒฌ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํธํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ ๋งํผ ์ ์์ ๋ํ ์ง์ ํ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ์ง ์์์ต๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก try(...)๊ฐ ์ค๊ณ ์๋ค๋ ์ฌ์ค์ ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ try(...) ํจ์๋ก ์๋ํ๋ ๊ฒ์ด ์ ํธ๋๋ ์๋ฃจ์ ์ธ ์ด์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋จ์ง ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ฐ๊ธฐ๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ถ๋ช ํ ์ข์ํฉ๋๋ค.
go์ ํต์ฌ ์์น ์ค ํ๋์ธ ์ ๊ฒฐํฉ๋ ์ ์๋ ์ง๊ต ๊ฐ๋
์ ๊ธฐ์ตํฉ์๋ค. ์ด ์ ์์ go์ ์ง๊ต ๊ฐ๋
(์ง์ฐ, ๋ช
๋ช
๋ ๋ฐํ ๋งค๊ฐ๋ณ์, ์ฌ์ฉ์ ์ฝ๋๋ฅผ ํตํด ๋ถ๊ฐ๋ฅํ ์์
์ ์ํํ๋ ๋ด์ฅ ํจ์ ๋ฑ)์ ํ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
go ์ฌ์ฉ์๋ if err != nil { return err } ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ฑฐ๋ ์ ๊ฑฐํ๊ธฐ ์ํด ์๋
๊ฐ ๋ณดํธ์ ์ผ๋ก ์์ฒญํ์ต๋๋ค. Go ์ฌ์ฉ์ ์ค๋ฌธ์กฐ์ฌ๋ ์ด๊ฒ์ด ์ค์ ๋ฌธ์ ์์ ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋ ํ์ ์ด๊ฒ์ด ์ค์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์์์ ํฐ ์๋ฆฌ๊ฐ ๋ฐ๋ํ์ ์
์ฅ์ ๋๋ฌด ์น์ฐ์น์ง ์์ ๊ฒ ๊ฐ์ ๋คํ์ด๋ค.
์์์ goto if err != nil๋ก ์๋ํ๋ ๊ฒ์ ๋ํด ํ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ฐฉํฅ์ด๋ผ๊ณ ํ๋จํ๋ฉด "์๋ ํ๋ค ๋ฆฌํด"์ "์๋ ํ๋ค ๊ณ ํ "๋ก ๊ฐ์กฐํ๊ธฐ ํ๋ค๊น์,
goto๊ฐ ํ ๋น๋์ง ์์ ๋ณ์๋ฅผ ์ง๋๊ฐ ์ ์๋ค๋ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ์ํ๋ค๋ฉด?
@ugorji๋, ๋ฉ๋ชจํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์์์ goto if err != nil๋ก ์๋ํ๋ ๊ฒ์ ๋ํด ํ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ฐฉํฅ์ด๋ผ๊ณ ํ๋จํ๋ฉด "์๋ ํ๋ค ๋ฆฌํด"์ "์๋ ํ๋ค ๊ณ ํ "๋ก ๊ฐ์กฐํ๊ธฐ ํ๋ค๊น์,
goto๊ฐ ํ ๋น๋์ง ์์ ๋ณ์๋ฅผ ์ง๋๊ฐ ์ ์๋ค๋ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ์ํ๋ค๋ฉด?
๋ค, ๋ง์ต๋๋ค. #26058์ ๋ํ ํ ๋ก ์ด ์์ต๋๋ค.
๋ด ์๊ฐ์ 'try-goto'์๋ ์ ์ด๋ ์ธ ๋ฒ์ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
(1) ํ ๋น๋์ง ์์ ๋ณ์์ ์๋ตํด์ผ ํฉ๋๋ค.
(2) ์ด๋ค ์๋๊ฐ ์คํจํ๋์ง์ ๋ํ ์คํ ์ ๋ณด๋ฅผ ์๊ฒ ๋๋ฉฐ, ๋ฐ๋๋ก return+defer ์ผ์ด์ค์์ ์ฌ์ ํ ์บก์ฒํ ์ ์์ต๋๋ค.
(3) ๋๊ตฌ๋ goto์์ ๋ฏธ์ํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
์, try
์ด ๋ฐฉ๋ฒ์
๋๋ค.
try
๋ฅผ ํ ๋ฒ ์ถ๊ฐํด ๋ณด์๋๋ฐ ๋ง์์ ๋ค์์ต๋๋ค.
ํจ์น - https://github.com/asheglov/go/pull/1
Reddit ์ฃผ์ - https://www.reddit.com/r/golang/comments/6vt3el/the_try_keyword_proofofconcept/
@griesemer
https://github.com/golang/go/issues/32825#issuecomment -507120860์์ ๊ณ์ ...
try
์ ๋จ์ฉ์ด ์ฝ๋ ๊ฒํ , ์ฌ์ฌ ๋ฐ/๋๋ ์ปค๋ฎค๋ํฐ ํ์ค์ ์ํด ์ํ๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ ํจ๊ป try
์ ์ ์ฐ์ฑ์ ์ ํํ๊ธฐ ์ํด ์ธ์ด ๋ณ๊ฒฝ์ ํผํ๋ ๊ฒ์ด ์งํ๋กญ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ผ๋ถ ๋ถ๋ฅํ๋ฉด ์๋ ๋ฐ ์๋์ ๋ ๊ฐ์ง ํ์์ ์ค๋ฅ ๊ฒฝ๋ก ์ ์ด ํ๋ฆ์ด ํํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๋ฅ ๋ํ๊ณผ ๊ด๋ จํ์ฌ ์ง์ , ๊ฐ์ ๋ฐ ํต๊ณผ์ ์ธ ๊ฐ์ง ํ์์ด ํํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ด 6๊ฐ์ ์ค๋ฅ ์ฒ๋ฆฌ "๋ชจ๋"๊ฐ ์์ฑ๋ฉ๋๋ค.
์๋ ๋ค์ด๋ ํธ ๋ฐ ์๋ ๋ค์ด๋ ํธ ๋ชจ๋๊ฐ ์ ํฉํด ๋ณด์ ๋๋ค.
wrap := func(err error) error {
return fmt.Errorf("failed to process %s: %v", filename, err)
}
f, err := os.Open(filename)
if err != nil {
return nil, wrap(err)
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return nil, wrap(err)
}
// in errors, named better, and optimized
WrapfFunc := func(format string, args ...interface{}) func(error) error {
return func(err error) error {
if err == nil {
return nil
}
s := fmt.Sprintf(format, args...)
return errors.Errorf(s+": %w", err)
}
}
```๊ฐ๋ค
wrap := errors.WrapfFunc("%s ์ฒ๋ฆฌ ์คํจ", ํ์ผ ์ด๋ฆ)
f, err := os.Open(ํ์ผ ์ด๋ฆ)
์๋(๋ฉ(์ค๋ฅ))
f.Close() ์ฐ๊ธฐ
์ ๋ณด, ์ค๋ฅ := f.Stat()
์๋(๋ฉ(์ค๋ฅ))
Manual Pass-through, and Automatic Pass-through modes are also simple enough to be agreeable (despite often being a code smell):
```go
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return nil, err
}
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
๊ทธ๋ฌ๋ ์๋ ๊ฐ์ ๋ฐ ์๋ ๊ฐ์ ๋ชจ๋๋ ๋ชจ๋ ๋ฏธ๋ฌํ ์ค์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ถ์พํฉ๋๋ค.
defer errd.Wrap(&err, "failed to do X for %s", filename)
var f *os.File
f, err = os.Open(filename)
if err != nil {
return
}
defer f.Close()
var info os.FileInfo
info, err = f.Stat()
if err != nil {
return
}
defer errd.Wrap(&err, "failed to do X for %s", filename)
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
๋ค์ ๋งํ์ง๋ง, ๋๋ ๊ทธ๊ฒ๋ค์ ๊ธ์งํ์ง ์๋๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์ง๋ง ๊ฐ์ ๋ชจ๋๋ฅผ ์ด์ง/์ถ๋ณตํ๋ ๊ฒ์ ์ด๊ฒ์ด ์ฌ์ ํ ์ ์๊ฒ ๋ถ๋ช ํ ์ํ ์ ํธ๋ฅผ ์ ๊ธฐํ๋ ๊ณณ์ ๋๋ค. ํ์ฌ๋ก์๋ ์ ์ ์ ์ฒด์ ๋ํด ํ๊ณ ํ๊ฒ ํ์์ ์ธ ํ๋๋ฅผ ์ ์งํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
Try๋ ๊ทธ ์ ์ฃผ๋ฅผ ํผํ๊ธฐ ์ํ ํจ์๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค.
info := try(try(os.Open(filename)).Stat())
ํ์ผ ๋์ถ.
try
๋ฌธ์ ์ฐ๊ฒฐ์ ํ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ณด๋์ค๋ก ๋ ์ ๋ณด์
๋๋ค. ํ์ง๋ง ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@sirkon try
๋ ํน๋ณํ๊ธฐ ๋๋ฌธ์ ์ค์ํ ๊ฒฝ์ฐ ์ธ์ด๋ ์ค์ฒฉ๋ try
์ ํ์ฉํ์ง ์์ ์ ์์ต๋๋ค. try
๊ฐ ํจ์์ฒ๋ผ ๋ณด์ด๋๋ผ๋ ๋ง์
๋๋ค. ๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ด try
์ ์ ์ผํ ์ฅ์ ๋ฌผ์ด๋ผ๋ฉด ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค( go vet
๋๋ ์ธ์ด ์ ํ). ์ด๊ฒ์์ ๊ณ์ ์งํํฉ์๋ค - ์ฐ๋ฆฌ๋ ์ง๊ธ ๊ทธ๊ฒ์ ๋ง์ด ๋ค์์ต๋๋ค. ๊ฐ์ฌ ํด์.
์ฌ๊ธฐ์ ๋์ด๊ฐ์ - ์ฐ๋ฆฌ๋ ์ ์๋ ๋ง์ด ๋ค์์ด
โ์ด๊ฑด ๋๋ฌด ์ง๋ฃจํด, ์ด์ฏค์์ ๋์ด๊ฐ์โ
๋ ๋ค๋ฅธ ์ข์ ์๋ ๋ก๊ทธ๊ฐ ์์ต๋๋ค.
- ๋น์ ์ ์ด๋ก ์ ์ฌ์ค๊ณผ ๋ชจ์๋ฉ๋๋ค!
- ์ฌ์ค์ด ๋ ๋์๋ค!
ํค๊ฒ
๋๋ ๋น์ ์ด ์ค์ ๋ก ์กด์ฌํ์ง ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ถ์ ํ ๋ฐฉ๋ฒ.
์ด ๋ฌธ์ ๊ฐ ์ค์ ๋ก ๋ํ๋๋ ์์น๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ธ๋ถ ์ธ๊ณ์ ๋ถ์์ฉ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ค์ ๋ก ์ํํธ์จ์ด ์์ง๋์ด๋ง์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ฅ ์ฌ์ด ๋ถ๋ถ ์ค ํ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ. ์ ๋ขฐ์ฑ์ด ๋จ์ด์ง๋ ๊ฐ์ฅ ์ฌ์ด ์ผ์ ๋จ์ํํด์ผ ํ๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ข ๋ฅ์ IMO์์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ๋ ๋ถ์ฐ ์์คํ (์ฌ์ค ๊ทธ๋ ๊ฒ ๋ถ์ฐ๋์ง ์์)์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ Go์์ ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์๋์์ต๋๋ค. ์ฌ๋ผ์ด์ค ๋ฐ ๋งต ์ดํด ๋ถ์กฑ, ํฉ/๋์/๋ถ์ฐ/์ ํ์ด ๋ฌด์์ด๋ ๋ถ์กฑํ๋ฉด ํจ์ฌ ๋ ์ง์ฆ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ ผ์์ด ๊ณ์๋๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ฐ๋ณต ํ๊ฒ ์ต๋๋ค.
๊ฒฝํ์ ์ด์ ๊ณ์๋๋ ํ ๋ก ๋ณด๋ค ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ์์ ์ ์ฝ๋ ๊ธฐ๋ฐ์์
try
๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์คํํ๊ณ ํผ๋๋ฐฑ ํ์ด์ง์์ ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์๊ฐ์ ๊ฐ๋๋ก ๊ถ์ฅํฉ๋๋ค.
๊ตฌ์ฒด์ ์ธ ๊ฒฝํ์ด ์ด ์ ์์ ์ฐฌ์ฑํ๊ฑฐ๋ ๋ฐ๋ํ๋ ์ค์ํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํ๋ค๋ฉด ์ฌ๊ธฐ์์ ๊ทธ ์ฌ์ค์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ๊ฐ์ธ์ ์ธ ์ ์ ๋๋ฌผ ์ง์ฆ, ๊ฐ์ ์๋๋ฆฌ์ค, ๋์ ๋์์ธ ๋ฑ ์ฐ๋ฆฌ๋ ์ธ์ ํ ์ ์์ง๋ง ์คํ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
๊ฐ์ฌ ํด์.
๋๋ ์ฌ๊ธฐ์ ๋ฌด๋กํ ๊ฒ์ ์ํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ์ค์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ปค๋ฎค๋ํฐ๋ ๋ณ๊ฒฝ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๋งค์ฐ ๊ฐ๋ ฅํ๊ฒ ๋งํ์ต๋๋ค. ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ์ฌ ์์คํ ์ ์ ํธํ๋ _๋ชจ๋_๋ฅผ ํ๋๊ฒ ํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ฌ๋์ ํ๋ณตํ๊ฒ ํ ์๋ ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ํ๋ณตํ ์ ์๋ 88%์ ์ง์คํฉ์๋ค(์๋ ๋ํ์จ์์ ๋ฐ์จ ์์น).
์ด ๊ธ์ ์ฐ๋ ์์ ์์ "๋ด๋ฒ๋ ค ๋์ธ์" ์ค๋ ๋๋ ์ฐฌ์ฑ 1322, ๋ฐ๋ 158์ ๋๋ค. ์ด ์ค๋ ๋๋ 158 ์, 255 ์๋์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ด ์ค๋ ๋์ ์ง์ ์ ์ธ ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ๊ณ์ ํธ์ํด์ผ ํ๋ ๋งค์ฐ ์ข์ ์ด์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ปค๋ฎค๋ํฐ๊ฐ ์๊ตฌํ๋ ๋ฐ๋ฅผ ํญ์ ์ํํ๊ณ ๋์์ ์ ํํ ์๊ฐ์ ์ ํ์ ํ๊ดดํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ต์ํ ์ด ํน์ ์ ์์ ์คํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์ข๊ฒ๋ go
๋ ์์ํ์์ ์ค๊ณํ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ๋ํ๋ ์ธ์ด์ ๊ด๋ฆฌ์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ํ ๋ ๊ณ์ ์ต์ ์ ๊ฒฐ์ ์ ๋ด๋ฆด ๊ฒ์ด๋ฉฐ ๋์ค์ ๋์ค์ ์ธ ์๊ฒฌ์ ๊ทผ๊ฑฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ์ง ์์ ๊ฒ์์ ๋ฏฟ์ด์ผ ํฉ๋๋ค. ๊ธฐ์ตํ์ญ์์ค. ๊ทธ๋ค์ ์ฐ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก go๋ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ค์ ์ฐ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ ํต์ ๋๋๋๋ค.
ํฌ์ง์ ์ด ์๋ค๋ฉด ๋ฐ๋ํ์ด ์ ์์ ๋ฐฉ์ดํ๋ ๊ฒ์ฒ๋ผ ์๊ฐ์ ๋ค์ฌ ๋ฐฉ์ดํ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์คํ ๋ถ๊ฐ๋ฅํ๊ณ ๋ํ๋ฅผ ์ง์ ์ํค์ง ๋ชปํ๋ ์ผ์ฌ์ฐฌ ๊ฐ์ ์ผ๋ก ๋ํ๋ฅผ ์ต์ฌ์ํฌ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ด ์์์ด ์ฌ๋ผ์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ฅผ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐธ์ฌํ๋ ค๋ ์ฌ๋๋ค์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
์ ์ ํ๋ก์ธ์ค๊ฐ ์์๋์์ ๋ Russ๋ ์ ์์ ์ํฅ์ ๋ฏธ์น๊ฑฐ๋ ๊ทํ์ ์์ฒญ์ ๊ฒฝ์ฒญํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฝํ ๋ณด๊ณ ์์ ํ์์ฑ์ ์ ํํ๋ ๋ฐ ํฐ ์ญํ ์ ํ์ต๋๋ค. ์ ์ด๋ ๊ทธ๊ฒ์ ์กด์คํ๋๋ก ๋ ธ๋ ฅํฉ์๋ค.
go ํ์ ์คํ ๊ฐ๋ฅํ ๋ชจ๋ ํผ๋๋ฐฑ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค. ๊ทธ๋ค์ ์์ง ์ฐ๋ฆฌ๋ฅผ ์ค๋ง์ํค์ง ์์์ต๋๋ค. ๋ณ์นญ, ๋ชจ๋ ๋ฑ์ ๋ํด ์์ฑ๋ ์์ธํ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ต์ํ ๊ทธ๋ค์๊ฒ ๋์ผํ ๊ด์ฌ์ ์ฃผ๊ณ ์ฐ๋ฆฌ์ ๋ฐ๋๋ฅผ ์๊ณ ํ๊ณ , ๋น์ ์ ๋ฐ๋์ ๋ํ ๊ทธ๋ค์ ์ ์ฅ์ ์๋ตํ๊ณ , ๋น์ ์ ๋ฐ๋๊ฐ ๋ฌด์๋๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์๊ฐ์ ๋ณด๋ด๋๋ก ํฉ์๋ค.
Go์ ์ด์ ์ ํญ์ ์ง๊ต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์๊ณ ๊ฐ๋จํ ์ธ์ด๋ผ๋ ์ ์ ๋๋ค. ํน์ ์์น์ ๊ฒฐ์ ํ๊ธฐ ์ ์ ๊ณต๊ฐ์ ๋นํ์ ์ผ๋ก ์๊ฐํ๋ ์์์ ์ฌ๋๋ค์ด ๋์์ธํ ๊ฒ์ ๋๋ค. ํฌํ๋ฅผ ํ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ฐ๋์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์๊ฑฐ๋ ์์ ํ ์ดํดํ์ง ๋ชปํ ์๋ ์๋ ๊ณณ์์ "๋ณด์๋ผ, ์ธ๊ธฐ ์๋ ํฌํ๋ ์๋์ค"๋ผ๊ณ ๋งํ๋ ๋์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ณณ์์ ๊ทธ๋ค์ ๋์์๋ค. ๋๋ ์ด ์๊ณ ๋จ์ํ ์ธ์ด์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ชจ๋ฅธ๋ค๊ณ ์ธ์ ํ ์ฐ์ฌ ํฌ์คํฐ๋ฅผ ์ฝ์์ต๋๋ค. ์ด๋ ๊ทํ์ ํผ๋๋ฐฑ์ ์ง์งํ๊ฒ ๋ฐ์๋ค์ด๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
์ฌํํผ, ๋ด๊ฐ ์ฌ๊ธฐ์ ์ด๋ฌ๊ณ ์๋ค๋ ์ฌ์ค์ด ์์ฐ๋ฝ์ต๋๋ค. ์ด ์๊ฒฌ์ ์์ ๋กญ๊ฒ ์ ๊ฑฐํ์ญ์์ค. ๋๋ ํ๋ฅผ ๋ด์ง ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๋๊ตฐ๊ฐ๋ ์ด๊ฒ์ ์ง์ค์ ์ผ๋ก ๋งํด์ผ ํฉ๋๋ค!
์ด ๋ ๋ฒ์งธ ์ ์ ์ ์ฒด๋ ๋์๊ฒ ์งํ๋ฅผ ์กฐ์งํ๋ ๋์งํธ ์ธํ๋ฃจ์ธ์์ ๋งค์ฐ ์ ์ฌํด ๋ณด์ ๋๋ค. ์ธ๊ธฐ๋ ์ฝํ ์คํธ๋ ๊ธฐ์ ์ ์ฅ์ ์ ํ๊ฐํ์ง ์์ต๋๋ค.
์ฌ๋๋ค์ ์นจ๋ฌตํ ์ ์์ง๋ง ๊ทธ๋ค์ ์ฌ์ ํ โโGo 2๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ๊ณผ Go 2์ ๋๋จธ์ง ๋ถ๋ถ์ ๊ธฐ๋ํฉ๋๋ค. Go 1์ ํ๋ฅญํ ์ธ์ด์ด๋ฉฐ ๋ค์ํ ์ข ๋ฅ์ ํ๋ก๊ทธ๋จ์ ์ ํฉํฉ๋๋ค. ๋๋ Go 2๊ฐ ๊ทธ๊ฒ์ ํ์ฅํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ง์ง๋ง์ผ๋ก try
๋ฅผ ์ง์ ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ ํธ๋๋ฅผ ๋ฐ๋๋ก ํ ๊ฒ์
๋๋ค. ์ง๊ธ์ ์๋ ๊ทธ๋๋ก์ ์ ์์ ์ง์งํฉ๋๋ค. "Go 1"๊ณผ์ ํธํ์ฑ ์ฝ์์ ๋ฐ๋ผ ์๋
์ด ์ง๋ ํ ์ฌ๋๋ค์ ๋ฐ๋์ด ๋์ ์๊ฒจ์ ธ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ๋ฌธ์ ๊ฐ ์๋ ๊ฐ์ ์ผ๋ก ์ธํด ์ด ๊ฒฝ์ฐ์ ์ธ์ด ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด ์ง๊ธ ์ ๋์๋ ํจ์ฌ ๋ ๋์ ํํ์ผ๋ก ๋ณด์
๋๋ค. ํธ์ง: ์ฌ์ค ํ์ธ์ ์ํ ๊ฒฝํ ๋ณด๊ณ ์๋ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
์ถ์ : ์ ๋ค๋ฆญ์ด ์ ์๋๋ฉด ์ด๋ค ๋ฐ๋๊ฐ ์ผ์ด๋ ์ง ๊ถ๊ธํฉ๋๋ค.
์ฐ๋ฆฌ ํ์ฌ์๋ ์ฝ 12๊ฐ์ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์ ๋ํด tryhard ๋๊ตฌ๋ฅผ ์คํํ๊ณ 933๊ฐ์ ์ ์ฌ์ ์ธ try() ํ๋ณด๋ฅผ ์ฐพ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก try() ํจ์๋ ๋จ์ํ ์ฝ๋ ์์ฉ๊ตฌ ๋ฌธ์ ์ด์์ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ํ๋ฅญํ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ถ์์ ํธ์ถ๋ ํจ์/๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ก ๋ฐํํฉ๋๋ค. ๋ค์์ ํ์ฉ๋์ง ์์ต๋๋ค.
var file= try(parse())
func parse()(err, result) {
}
์ค๋ฅ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฐ๋ ์ฑ์ ๋ฐฉํดํ๋ err!=nil err==nil ํจํด์ ๋์จํ๊ฒ ํ์ฉํ๋ ๋์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ํํ์ฌ IMO์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ฝ๋์ ์ํ์ ๋์ ๋๋ค.
func Foo() (err error) {
var file, ferr = os.Open("file1.txt")
if ferr == nil {
defer file.Close()
var parsed, perr = parseFile(file)
if perr != nil {
return
}
fmt.Printf("%s", parsed)
}
return nil
}
try()๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ผ๊ด๋๋ฉฐ ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
func Foo() (err error) {
var file = try(os.Open("file.txt"))
defer file.Close()
var parsed = try(parseFile(file))
fmt.Printf(parsed)
return
}
@lpar ๊ฐ Heroku์ ๋ชจ๋ ์์นด์ด๋ธ๋์ง ์์ Go ๋ฆฌํฌ์งํ ๋ฆฌ(๊ณต๊ฐ ๋ฐ ๋น๊ณต๊ฐ)์์ ์ํํ ๊ฒ๊ณผ ์ ์ฌํ ๋ช ๊ฐ์ง ์คํ์ ์คํํ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ด ์์ง์ ์์ต๋๋ค: https://gist.github.com/freeformz/55abbe5da61a28ab94dbb662bfc7f763
cc @davecheney
@ubikenobi ๋น์ ์ ๋ ์์ ํ ๊ธฐ๋ฅ์ ~is~๊ฐ ์๊ณ ์์์ต๋๋ค.
๋ํ ์ค๋ฅ ํ์ ๋ฐํ๋ ๊ฐ์ ๋ณธ ์ ์ด ์์ต๋๋ค. ํ์ง๋ง ํจ์๊ฐ ์ค๋ฅ์ ๊ดํ ๋ชจ๋ ๊ฒ์ด๊ณ ๋ฐํ๋ ๋ค๋ฅธ ๊ฐ์ด ์ค๋ฅ ์์ฒด์ ์์กดํ์ง ์๋ ๊ฒฝ์ฐ(์ด์ ๊ฐ์ "๋ณดํธ"ํ๋ ๋ ๋ฒ์งธ ์ค๋ฅ ๋ฐํ์ผ๋ก ์ด์ด์ง ์ ์์) ๊ทธ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์์ํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ผ๋ฐ์ ์ด์ง๋ ์์ง๋ง err == nil
๋ ์ผ๋ถ ์กฐ๊ธฐ ์์ต์ ๋ํ ํฉ๋ฒ์ ์ธ ํ
์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
@๋ฐ์ด๋น๋
๋์์ ๋ํด ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ ์์ ๋ชจ๋์ defer.Close()๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์์ต๋๋ค. (์ง๊ธ ์ ๋ฐ์ดํธ๋จ).
๋๋ ๊ทธ ์์๋ก ์ค๋ฅ๊ฐ ๋ฐํ๋๋ ๊ฒ์ ๊ฑฐ์ ๋ณด์ง ๋ชปํ์ง๋ง ๋์์ธ์ ์ํ ๊ฒ๋ณด๋ค ์ค์์ธ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์ ์ก์ ์ ์๋ ๊ฒ์ด ์ฌ์ ํ ์ข์ต๋๋ค.
๋๋ err==nil ์ผ์ด์ค๋ฅผ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ค๋ณด๋ค ์์ธ๋ก ๋ด ๋๋ค. ๋น์ ์ด ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ์ฉํ ์ ์์ง๋ง ๋ด๊ฐ ์ข์ํ์ง ์๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ํ๋นํ ์ด์ ์์ด ์ผ๊ด์ฑ ์์ด ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ด ์ข๊ฒ๋ ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์์ ๋๋ถ๋ถ์ ๋ช ๋ น๋ฌธ์ err!=nil์ด๋ฉฐ, ์ด๋ try() ํจ์์ ์ด์ ์ ์ฝ๊ฒ ์ป์ ์ ์์ต๋๋ค.
tryhard
๋ฅผ ์คํํ์ต๋๋ค. 45580์ค์ Go ์ฝ๋์์ tryhard
๋ ๋ค์ ์ธ 301๊ฐ์ ์ค๋ฅ๋ฅผ ์๋ณํ๊ฑฐ๋(๋ฐ๋ผ์ +301/-903 ๋ณ๊ฒฝ์ด ๋จ) ๊ฐ ์ค๋ฅ๊ฐ ์ฝ 3์ค์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํ ๋ ์ฝ๋์ ์ฝ 2%๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค. ๋์๊ฒ ์ค์ํ๊ฒ ๋๊ปด์ง๋ ์ฃผ์, ๊ณต๋ฐฑ, ๊ฐ์ ธ์ค๊ธฐ ๋ฑ์ ๊ณ ๋ คํฉ๋๋ค.try
๊ฐ ๋ด ์์
์ ์ด๋ป๊ฒ ๋ณํ์ํฌ์ง ํ๊ตฌํ๊ธฐ ์ํด tryhard์ ๋ผ์ธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ฃผ๊ด์ ์ผ๋ก ๊ทธ๊ฒ์ ๋์๊ฒ ๋งค์ฐ ๋ฉ์ง๊ฒ ํ๋ฌ๊ฐ๋๋ค! ๋์ฌ try ๋ ํธ์ถํ๋ ํจ์์์ ๋ญ๊ฐ ์๋ชป๋ ์ ์๋ค๋ ๊ฒ์ด ๋ ๋ช
ํํ๊ฒ ๋๊ปด์ง๊ณ ์ด๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ํํฉ๋๋ค. ๋๋ if err != nil
๋ฅผ ์ฐ๋ ๋ฐ ๋งค์ฐ ์ต์ํ๋ฉฐ, ๋ณ๋ก ์ ๊ฒฝ ์ฐ์ง ์์ง๋ง ๋ณ๊ฒฝํ๋ ๋ฐ์๋ ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ์
๋๋ค. ์ค๋ฅ ์ด์ ์ ๋น ๋ณ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํ๊ณ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ(์ฆ, ๋น ์ฌ๋ผ์ด์ค/๋งต/๋ณ์๋ฅผ ๋ฐํํ๋๋ก ๋ง๋๋ ๊ฒ)์ err
์์ฒด๋ณด๋ค ๋ ์ง๋ฃจํ ๊ฒ์
๋๋ค.try(json.Unmarshal(b, &accountBalance), "failed to decode bank account info for user %s", user)
์ ๊ฐ์ ์ปจํ
์คํธ๋ฅผ ์ ํ์ ์ผ๋ก ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ try
๊ฐ ๊ฐ๋ณ์ ์ด๋ฉด ์ข์ ๊ฒ์
๋๋ค. ํธ์ง: ์ด ์ง์ ์ ์๋ง๋ ์ฃผ์ ์์ ๋ฒ์ด๋ฌ์ ๊ฒ์
๋๋ค. ์๋ํ์ง ์์ ์ฌ์์ฑ์ ๋ณด๋ฉด ์ด๊ฒ์ด ๋ฐ์ํ๋ ๊ณณ์
๋๋ค.๊ต์ฒด๊ฐ ํฉ๋ฆฌ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์๋ จ๋ Gophers๊ฐ ๊ฒ์ฆํ ์์ค์์ ์ด ์์ ์ ์ํํด์ผ ํ์ง ์์ต๋๊น? ๊ทธ "2%" ์ฌ์์ฑ ์ค ์ผ๋ง๋ ๋ง์ ๋ถ๋ถ์ด ๋ช ์์ ์ฒ๋ฆฌ๋ก ์ฌ์์ฑ๋์ด์ผ ํฉ๋๊น? ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ชจ๋ฅธ๋ค๋ฉด LOC๋ ์๋์ ์ผ๋ก ์ธ๋ชจ์๋ ๋ฉํธ๋ฆญ์ผ๋ก ๋จ์ ์์ต๋๋ค.
* ์ด๊ฒ์ด ๋ฐ๋ก ์ค๋ ์์นจ ๋ด ๊ฒ์๋ฌผ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ "๋ชจ๋"์ ์ด์ ์ ๋ง์ถ ์ด์ ์
๋๋ค. ์์์ ๋ผ์ธ ์นด์ดํฐ๋ฅผ ์คํํ๋ ๊ฒ๋ณด๋ค try
์ฉ์ดํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ชจ๋๋ฅผ ๋
ผ์ํ ๋ค์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฝ๋์ ์ ์ฌ์ ์ํ๊ณผ ์จ๋ฆํ๋ ๊ฒ์ด ๋ ์ฝ๊ณ ์ค์ง์ ์
๋๋ค.
@kingishb ๋ฐ๊ฒฌ๋ _try_ ์คํ ์ค ๊ธฐ๋ณธ์ด ์๋ ํจํค์ง์ ๊ณต๊ฐ ๊ธฐ๋ฅ์ ๋ช ๊ฐ ์์ต๋๊น? ์ผ๋ฐ์ ์ผ๋ก ๊ณต์ฉ ํจ์๋ ํจํค์ง ๊ณ ์ (์: ๋ํ ๋๋ ๋ฐ์ฝ๋ ์ดํธ) ์ค๋ฅ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค....
@networkimprov ๋ด ๊ฐ์ฑ์ ๋ํ ์ง๋์น๊ฒ ๋จ์ํ ๊ณต์์ ๋๋ค. ๊ทธ๊ฒ์ด ์ฌ์ค์ธ ๊ณณ์ ๊ฒ์ฌ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ API ํ๋ฉด๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํธ์ถ ์คํ์์์ ์์น๊ฐ ์๋๋ผ ์ปจํ ์คํธ์ ๊ด๋ จ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ฅ ๋ฉ์์ง์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค.
ํ์ฌ ๋ฉํธ๋ฆญ์์ ๋ง์ ์คํ์ง๊ฐ ํต๊ณผํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์๋ ๊ดํ(https://blog.golang.org/errors-are-values)์ ๋ฐ๋ฅด๋ฉด์ ๋ฐ์ํ๋ ๋๋ฝ์ ์ด๋ป์ต๋๊น? try
๋ ๊ทธ๋ฌํ ๊ดํ์ ์ฌ์ฉ์ ์ค์ผ ์ ์์ผ๋ฉฐ ๊ทธ๋ฐ ์๋ฏธ์์ ๊ต์ฒด์ ์ฃผ์ ๋์์
๋๋ค(์๋ง๋ ์ ๋ง ํฅ๋ฏธ๋ก์ด ์ ์ผํ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋์ผ ๊ฒ์
๋๋ค). ๊ทธ๋์ ๋ค์, ์ด๊ฒ์ ๋ ๋ง์ ์ค์ฌ ์์ด ๊ธฐ์กด ์์ค๋ฅผ ๊ธ๋ ๊ฒ์ ๋ฌด์๋ฏธํด ๋ณด์
๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์์งํด ์ฃผ์ @ubikenobi , @freeformz ๋ฐ @kingishb ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ฐ์ฌํฉ๋๋ค! ์ ์ณ๋๊ณ , -err=""
์ต์
๊ณผ ํจ๊ป tryhard
๋ฅผ ์คํํ๋ฉด ์ค๋ฅ ๋ณ์๊ฐ err
๊ฐ ์๋ ๋ค๋ฅธ ์ฝ๋(์: e
). ์ด๊ฒ์ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ฐ๋ผ ๋ช ๊ฐ์ง ๋ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค(๊ทธ๋ฌ๋ ๋ํ ์คํ ๊ฐ๋ฅ์ฑ๋ ์ฆ๊ฐํ ์ ์์).
๋ ๋ง์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ฐพ๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ @griesemer . ๋ ๊ฐ์ ๋ง์ดํฌ๋ก ์๋น์ค์ ๋ํด tryhard
๋ฅผ ์คํํ์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
ํด๋ก v 1.82 / ํธ๋ผ์ดํ๋
13280 Go ์ฝ๋ ๋ผ์ธ / ์๋๋ฅผ ์ํด ์๋ณ๋ 148(1%)
๋ค๋ฅธ ์๋น์ค:
9768 Go ์ฝ๋ ๋ผ์ธ/์๋์ฉ์ผ๋ก ์๋ณ๋ 50๊ฐ(0.5%)
๊ทธ ํ tryhard
๋ ๋ค์ํ ๋ง์ดํฌ๋ก ์๋น์ค ์ธํธ๋ฅผ ๊ฒ์ฌํ์ต๋๋ค.
314343 Go ์ฝ๋ ๋ผ์ธ / ์๋์ฉ์ผ๋ก ์๋ณ๋ 1563(0.5%)
๋น ๋ฅธ ์ ๊ฒ์ ํ๊ณ ์์ต๋๋ค. try
๊ฐ ์ต์ ํํ ์ ์๋ ํจํค์ง ์ ํ์ ์ผ๋ฐ์ ์ผ๋ก ๋ํ๋ ์๋น์ค์์ ๋ฐํ๋ (GRPC) ์ค๋ฅ๋ฅผ ํฌ๋ช
ํ๊ฒ ๋ฐํํ๋ ์ด๋ํฐ/์๋น์ค ๋ํผ์
๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ทธ๊ฒ์ ์ ๋์ ์ผ๋ก ๋์ ์๊ฐ์ ๋๋ค.
err
var๋ defer
์ ๋ํด ์ธ์ ๋ํ๋ฉ๋๊น? "์์์ ๋ณด๋ค ๋ช
์์ "์ ์ด๋ป์ต๋๊น?defer
๋ ๋ณด๊ธฐ ํํ๊ณ ์ดํดํ๊ธฐ ํ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.os.Exit
๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ํ์ธ๋์ง ์์ต๋๋ค.๋ฐฉ๊ธ ํจํค์ง(๊ณต๊ธ์
์ฒด ํฌํจ)์์ tryhard
๋ฅผ ์คํํ๋๋ฐ ์ฝ๋ ์๊ฐ 873934
์์ 851178
๋ก ๋จ์ด์ง๋ $# 2478
๋ฅผ ๋ณด๊ณ ํ์ง๋ง ํ์คํ์ง ์์ต๋๋ค. ์ค๋ฒ๋ํ(stdlib๊ฐ ์คํ ์ถ์ ์ค๋ฅ ๋ํ์ ๋ํ ์ง์์ด ์์)์ผ๋ก ์ธํ ๊ฒ์ธ์ง ๋๋ ํด๋น ์ฝ๋์ ์๋น ๋ถ๋ถ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ดํ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ.
๊ทธ๋ฌ๋ ๋ด๊ฐ ์๋ ๊ฒ์ ์ด๋ฒ ์ฃผ์๋ง if err != nil { return nil }
์ ๊ฐ์ ๋ณต์ฌ ํ์คํ์ $#$5 error: cannot process ....file: cannot parse ...file: cannot open ...file
#$ ์ ๊ฐ์ ์ค๋ฅ๋ก ์ธํด ์ฐฝํผํ ์๊ฐ์ ๋ญ๋นํ๋ค๋ ๊ฒ์
๋๋ค.
\
๋๋ ๋ํ ๊ถ์์ ํธ์ํ๋ ค๋ ์๋๋ฅผ ๋๋ฌด ์ฌ๊ฐํ๊ฒ ๋ฐ์๋ค์ด์ง ์์ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ๋์ผํ ๋น๊ตญ์ ์์ ์ ๋ฌด์ง ๋ฐ/๋๋ ์คํด๊ฐ ์ง์ ๋ ํ์๋ ์๋ก์ด ์์ด๋์ด์ ์ ์์ ๊ฑฐ๋ถํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
\
์ฐ๋ฆฌ๋ ๊ฐ์ฅ ํฐ(ํ
์คํธ๋ฅผ ํฌํจํ ยฑ163,000์ค์ ์ฝ๋) ์๋น์ค์์ tryhard -err=""
๋ฅผ ์คํํ์ต๋๋ค. 566๋ฒ์ ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋์์ต๋๋ค. ์ฝ๋์ ์ผ๋ถ๊ฐ if err != nil
๋ฅผ ์ผ๋์ ๋๊ณ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค(๋ฐ๋ณต ๋ฐฉ์ง์ ๋ํ Rob Pike์ "์ค๋ฅ๋ ๊ฐ์
๋๋ค" ๊ธฐ์ฌ๊ฐ ๋ ์ค๋ฆ).
@griesemer ์์ ์ ์ ํ์ผ ์ ์ถ๊ฐํ์ต๋๋ค. -err=""๋ก ์์ฑ๋์์ต๋๋ค. ํ์ธํด๋ณด๋ ์ฝ๊ฐ์ ๋ณํ๊ฐ ์์ต๋๋ค. ์ ๋ ์ค๋ ์์นจ์ tryhard ์ ๋ฐ์ดํธ๋ฅผ ํด์ ์ต์ ๋ฒ์ ๋ ์ฌ์ฉํ์ต๋๋ค.
@griesemer ๊ณ์ฐํ ์ ์๋ค๋ฉด tryhard๊ฐ ๋ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
a) ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ํธ์ถ ์ฌ์ดํธ์ ์
b) ๋จ์ผ ๋ฌธ if err != nil [&& ...]
ํธ๋ค๋ฌ์ ์( on err
#32611์ ๋ํ ํ๋ณด)
c) ๋ฌด์์ด๋ ๋ฐํํ๋ ์ฌ๋๋ค์ ์( defer
#32676์ ๋ํ ํ๋ณด์)
d) err
๋ฅผ ๋ฐํํ๋ ์ฌ๋๋ค์ ์( try()
ํ๋ณด)
e) ๊ธฐ๋ณธ์ด ์๋ ํจํค์ง์ ๋ด๋ณด๋ธ ๊ธฐ๋ฅ์ ์๋ ํญ๋ชฉ์ ์(์คํ ๊ฐ๋ฅ์ฑ์ด ์์)
์ด LoC๋ฅผ return err
์ ์ธ์คํด์ค์ ๋น๊ตํ๋ฉด ์ปจํ
์คํธ๊ฐ ๋ถ์กฑํฉ๋๋ค. IMO.
@networkimprov ๋์ํจ - ์ ์ฌํ ์ ์์ด ์ด์ ์ ์ ๊ธฐ๋์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์ ๋ ์ ์๊ฐ์ ์ฐพ๋๋ก ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
๋ค์์ ๋ด๋ถ ์ฝ๋๋ฒ ์ด์ค์ ๋ํด tryhard๋ฅผ ์คํํ ํต๊ณ์ ๋๋ค(์ข ์์ฑ์ด ์๋ ์ฝ๋๋ง ํด๋น).
์ ์:
๋ ธ๋ ฅํ ํ:
ํธ์ง: ์ด์ @griesemer๊ฐ ์์ฝ ํต๊ณ๋ฅผ ํฌํจํ๋๋ก tryhard ๋ฅผ ์ ๋ฐ์ดํธํ์ผ๋ฉฐ ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง๊ฐ ๋ ์์ต๋๋ค.
if
๋ช
์ธ์์ 39.2%๋ if <err> != nil
์
๋๋ค.try
ํ๋ณด์์
๋๋ค.tryhard๊ฐ ์ฐพ์ ๋์ฒด ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด try
์ ์ฌ์ฉ์ด ๋งค์ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฝ๋ ์ ํ๊ณผ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋ ๋ค๋ฅธ ์ ํ์ด ๋ถ๋ช
ํ ์์ต๋๋ค.
๋๋ ๋ํ tryhard๊ฐ ๋ณํํ ์ ์์ง๋ง try๋ก๋ถํฐ ํฐ ์ด์ ์ ์ป์ ์ ์๋ ์ผ๋ถ ์ฅ์๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ๊ฐ๋จํ ์ ์ ํ๋กํ ์ฝ(๋จ์ํจ/๋ช ํ์ฑ์ ์ํด ํธ์ง๋จ)์ ๋ฐ๋ผ ๋ฉ์์ง๋ฅผ ๋์ฝ๋ฉํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ฝ๋์ ๋๋ค.
func (req *Request) Decode(r Reader) error {
typ, err := readByte(r)
if err != nil {
return err
}
req.Type = typ
req.Body, err = readString(r)
if err != nil {
return unexpected(err)
}
req.ID, err = readID(r)
if err != nil {
return unexpected(err)
}
n, err := binary.ReadUvarint(r)
if err != nil {
return unexpected(err)
}
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err = readID(r)
if err != nil {
return unexpected(err)
}
}
return nil
}
// unexpected turns any io.EOF into an io.ErrUnexpectedEOF.
func unexpected(err error) error {
if err == io.EOF {
return io.ErrUnexpectedEOF
}
return err
}
try
๊ฐ ์์ผ๋ฉด ํ ๊ณณ์์ ์ฒ๋ฆฌํด๋ ํฐ ๊ฐ์ ์ด ์๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ฐํ ์ง์ ์ unexpected
๋ฅผ ์ผ์ต๋๋ค. ๊ทธ๋ฌ๋ try
๋ฅผ ์ฌ์ฉํ๋ฉด defer๋ฅผ ์ฌ์ฉํ์ฌ unexpected
์ค๋ฅ ๋ณํ์ ์ ์ฉํ ๋ค์ ์ฝ๋๋ฅผ ํฌ๊ฒ ๋จ์ถํ์ฌ ๋ ๋ช
ํํ๊ณ ์ฝ๊ฒ ํ์ด๋ณผ ์ ์์ต๋๋ค.
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
@cespare ํํ์คํฑ ๋ฆฌํฌํธ!
์์ ํ ์ถ์๋ ์ค๋ํซ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ข์ง๋ง ๊ดํธ๋ ๋ด๊ฐ ์์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋์ฉ๋๋ค. ๋ฃจํ ๋ด์ try
๋ ์์ํ ๋งํผ ๋์ฉ๋๋ค.
ํค์๋๋ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๊ณผ ๋ค๋ฅธ ์ ์ ์ฝ๊ฐ ์ดํ์ค์ ์ ๋๋ค. ๋ค์์ ์ฝ์ ์ ์์ผ๋ฉฐ ๋ฐํ๋๋ ๊ฐ์ด ํ๋๋ง ์๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฌํจ์ ๋ํด ๊ฑฑ์ ํ์ง ์์ต๋๋ค(ํ์ง๋ง ์ฌ์ ํ ๋ ๊ธด ํจ์ ๋ฐ/๋๋ ์ค์ฒฉ์ด ๋ง์ ํจ์์์ ๋ํ๋ ์ ์์).
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = wrapEOF(err) }()
req.Type = try readByte(r)
req.Body = try readString(r)
req.ID = try readID(r)
n := try binary.ReadUvarint(r)
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err = readID(r)
try err
}
return nil
}
*๊ณต์ ํ๊ฒ ๋งํ๋ฉด ์ฝ๋ ๊ฐ์กฐ ํ์๊ฐ ๋ง์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ทธ๋ฅ ์ ๋ ดํ ๋ฆฝ์คํฑ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ ๋ง ๋์ ์ฝ๋์ ๊ฒฝ์ฐ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ด์ ์ด ์๋ค๋ ๊ฒ์ ์ดํดํ๊ณ ๊ณ์ญ๋๊น?
unexpected()
๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ์๋ ๊ทธ๋๋ก ๋ฐํํ๋ฉด ์ฝ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํด ์๋ฌด ๊ฒ๋ ์ ์ ์์ต๋๋ค.
try
๋ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋์ง ์์ง๋ง ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
@cespare ๋์ฝ๋๋ ๋ด๋ถ์ ์ค๋ฅ ์ ํ์ด ์๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ ์๋ ์์ต๋๋ค. ๋ฉ์๋๋ ๋ชจ๋ ์์
์ ์ err == nil
๋ฅผ ํ์ธํ๊ณ ๋ถ์ธ ok๋ฅผ ๋ฐํํฉ๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฑ์ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค์ด๊ธฐ ๋๋ฌธ์ try
๋ ์ด ํน์ ๊ฒฝ์ฐ์ ๋ํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง์ ์ด ์๋, ๋ ์งง๊ณ ๋ ๊ฐ๊ฒฐํ ๊ด์ฉ๊ตฌ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋์ ์ผ๋ก ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
@makhov "์ ๋ง ๋์ ์ฝ๋"๋ ์ค๋ฅ๋ฅผ ๋ํํ์ง ์๋ ์ฝ๋๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
a, b, c, err := someFn()
if err != nil {
return ..., errors.Wrap(err, ...)
}
๋ค์๊ณผ ๊ฐ์ด ์๋ฏธ์ ์ผ๋ก ๋์ผํ[1] ์ฝ๋๋ก ๋ณํํฉ๋๋ค.
a, b, c, err := someFn()
try(errors.Wrap(err, ...))
์ ์์ ์ค๋ฅ ๋ํ์ defer๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ์ธ์ด ๋ณ๊ฒฝ ์์ด defer ์ธก๋ฉด์์ ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ ์์ ์ด์ ๋ฐ๋ณต์์ handle
ํค์๋๊ฐ ํ์ํ์ง ์์ ์ด์ ๋ง ์ค๋ช
ํฉ๋๋ค.
(๊ทํ์ ๋ค๋ฅธ ์๊ฒฌ๋ ์ ์๋ ๋ด์ฉ์ ํต์ฌ์ด ์๋ ์ ์์์ ์์ ๋๋ ์์ฌ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ ๊ฐ์ต๋๋ค)
54K LOC๋ก ์ฝ๋๋ฒ ์ด์ค์์ tryhard
๋ฅผ ์คํํ๋๋ฐ 1116๊ฐ์ ์ธ์คํด์ค๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
๋๋ diff๋ฅผ ๋ณด์๊ณ , try์์ ํฐ ์ด์ ์ ์ป์ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๊ฑฐ์ ์๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด if err != nil
์ ํ์ ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์ ์์ ํ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ถ๊ฐ๋ ์ปจํ
์คํธ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. try
๊ฐ ์ค์ ๋ก ์ฝ๋ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ ๋ช ๊ฐ์ง ๊ฒฝ์ฐ๋ง ์ฐพ์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, ํ์ฌ ํ์์ try
๋ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
- **if err := **json.NewEncoder(&buf).Encode(in)**; err != nil {**
- **return err**
- **}**
+ try(json.NewEncoder(&buf).Encode(in))
๋๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๊ฐํฉ๋๋ค.
์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ์ผ๋ฏ์ด try
๋ก ์ด ์ ์์ง๋ง ๋ด ์ฝ๋์์ ์๋ํด ๋ณธ ํ์๋ ๊ฐ์ธ์ ์ผ๋ก ์ธ์ด์ ์ด๊ฒ์ ๋์
ํ์ง ์๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด $.02
์ธ๋ชจ์๋ ๊ธฐ๋ฅ, ํ์ดํ์ ์ ์ฝํ์ง๋ง ํฐ ๋ฌธ์ ๋ ์๋๋๋ค.
์ฐจ๋ผ๋ฆฌ ์๋ ๋ฐฉ์์ ํํฉ๋๋ค.
๋ ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ์ฝ๊ฒ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค.
์๊ฐ๋ง ์ข...
๊ทธ ๊ด์ฉ๊ตฌ๋ go์์ ์ ์ฉํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ๊ทธ๊ฒ์
๋๋ค: ๋น์ ์ด ํด์ผ ํ๋ ๊ด์ฉ๊ตฌ
์๋ก ์จ ์ฌ๋๋ค์๊ฒ ๊ฐ๋ฅด์น๋ค. ์๋ก์ด go ํ๋ก๊ทธ๋๋จธ๋ ๊ทธ๊ฒ์ ๋ฐฐ์์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ค์
"์จ๊ฒจ์ง" ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฆฌํฉํ ๋งํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๋ํ,
๋น์ ์ด ์์ง ์๋ ํ ๊ทธ ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ๋ ์งง์ง ์์ต๋๋ค (์ ๋ฐ๋)
๋ฐฉ๋ฒ์ ๊ณ์ฐํฉ๋๋ค.
์ด์ try๊ฐ ๊ตฌํ๋์๋ค๊ณ ์์ํด ๋ด
์๋ค. ์ด ๊ด์ฉ๊ตฌ๋
๊ทธ ์ฌ์ฉ ์ฌ๋ก? ๊ณ ๋ คํ๋ฉด:
๊ทธ๋์ ์๋ง๋ ๊ทธ ๊ด์ฉ๊ตฌ๋ try๋ก ๋์ฒด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ๊ฒ์ ๋๋ค.
Em ter, 2019๋ 7์ 2์ผ 18:06, ์๋ฆผ @github.com escreveu:
@cespare https://github.com/cespare ๋์ฝ๋๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ ์ ์์ต๋๋ค.
๋ด๋ถ์ ์ค๋ฅ ์ ํ, err == nil์ ๊ฒ์ฌํ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
๋ชจ๋ ์์ ์ ์ํํ๊ณ ๋ถ์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค.์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฑ์ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค์ด๊ธฐ ๋๋ฌธ์ try๋ ์ ๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
๋ง์ ์ด ์๋, ๋ ์งง๊ณ ๊ฐ๊ฒฐํ ๊ด์ฉ๊ตฌ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ํน์ ๊ฒฝ์ฐ์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAT5WM3YDDRZXVXOLDQXKH3P5O7L5A5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVEXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAT5WMYXLLO74CIM6H4Y2RLP5O7L5ANCNFSM4HTGCZ7Q
.
์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ ๋ด ์๊ฐ์ ์ข์ ๊ฒ์ ๋๋ค. ์ฆ, try์ ๋ํ ๊ฐ๋ ฅํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ณด์ด์ง ์์ต๋๋ค.
๋๋ ์ด ์์ด๋์ด์ ๋ํด ๊ฐ๋ฐฉ์ ์ด์ง๋ง ์คํ ๋ถํ ์ด ๋ฐ์ํ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ด ํฌํจ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Xerror/Is๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ง๋ง(์: ์ค๋ฅ๊ฐ ErrNotExists์ธ ๊ฒฝ์ฐ Open์์ ๋ฐ์ํ๋ค๊ณ ์ถ๋ก ํ ์ ์์), ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ๊ฑฐ์ ์ค๋ฅ๋ฅผ ํฌํจํ์ฌ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋์ฒด๊ฐ ์์ต๋๋ค.
์ ์ด ํ๋ฆ์ด ๋ณ๊ฒฝ๋ ์์น์ ๋ํ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ณต๊ตฌ์ ์ ์ฌํ ๋ด์ฅ ๊ธฐ๋ฅ์ด ํฌํจ๋ ์ ์์ต๋๊น? ์๋ง๋ ์ ๋ ดํ๊ฒ ์ ์งํ๊ธฐ ์ํด try() ๋์ ๋ณ๋์ ํจ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋๋ฉด debug.Try()์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ง ๋๋ฒ๊ทธ ์ ๋ณด๊ฐ ์ถ๊ฐ๋์ด ์๋ํ์๊ฒ ์ต๋๊น? ์ด ๋ฐฉ๋ฒ์ผ๋ก try()๋ ์ค๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ์์กดํ์ง ์๊ณ ๋ ์ค๋๋ ์ค๋ฅ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋์์ try()๊ฐ ์ปจํ ์คํธ๋ฅผ ๋ํํ๊ณ ์ถ๊ฐํ๋ ๊ฒ์ด์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ๋ชฉ์ ์์ด ์ฑ๋ฅ์ ์ ํ์ํค๋ฏ๋ก ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ ์๋ฉ๋๋ค.
ํธ์ง: ์ด๊ฒ์ ์์ฑํ ํ ์ปดํ์ผ๋ฌ๊ฐ "๋ณต๊ตฌ"์ ์ ์ฌํ ์ปจํ ์คํธ ์ ๊ณต ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ defer ๋ฌธ์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ฌ์ฉํ try() ๋ณํ์ ๊ฒฐ์ ํ ์ ์๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์ด๊ฒ์ ๋ณต์ก์ฑ์ ๋ํด ํ์คํ์ง ์์ง๋ง
@lesrrat ์ด ๋๊ธ์์ ๋ด ์๊ฒฌ์ ๋งํ์ง๋ ์๊ฒ ์ง๋ง "try"๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ์ค๋ช ํ ๊ธฐํ๊ฐ ์๋ค๋ฉด if ๋ฌธ์ ๋ ๊ฐ ์ด์์ ํ ํฐ์ ์ธ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ if ๋ฌธ์ 200๊ฐ์ ์กฐ๊ฑด์ ์์ฑํ๋ฉด ๋ง์ ์ค์ ์ค์ผ ์ ์์ต๋๋ค.
if try(foo()) == 1 && try(bar()) == 2 {
// err
}
n1, err := foo()
if err != nil {
// err
}
n2, err := bar()
if err != nil {
// err
}
if n1 == 1 && n2 == 2 {
// err
}
@mattn ๊ทธ๊ฒ โโ๊ทธ๋ ๊ธด ํ์ง๋ง _์ด๋ก ์ ์ผ๋ก๋_ ๋น์ ์ด ์ ๋์ ์ผ๋ก ์ณ์ต๋๋ค. try
๊ฐ ๋ฑ ๋ค์ด๋ง๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ผ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๋๋ ์ค์ํ์์ ์ต์ํ _I_๋ ๋ฒ์ญ์ ํตํด _๋ด ์ฝ๋_์์ ์๋ํ๋ ๋ฐ ๋์์ด ๋ ๊ทธ๋ฌํ ๊ตฌ์ฑ์ ๋ฐ์์ ๊ฑฐ์ ์ฐพ์ง ๋ชปํ๋ค๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋ค๋ฅด๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ง๋ง PoC ๋ฒ์ญ์ ๊ธฐ๋ฐ์ผ๋ก ์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ try
์ ๋์
์ผ๋ก ์ค์ ๋ก ๋ง์ ๊ฒ์ ์ป์ง ๋ชปํ๋ค๋ ์ ์์ ๋๊ตฐ๊ฐ๊ฐ ์ฐจ์๋ฒจ์ ์ธ๋ฆด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ ์ณ๋๊ณ , ๋๋ ์ฌ์ ํ ๋ด ์ฝ๋์์ ๋น์ ์ ์คํ์ผ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ธ ๊ฒ์ด๋ค
n1 := try(foo())
n2 := try(bar())
if n1 == 1 && n2 == 2 {
return errors.New(`boo`)
}
๊ทธ๋์ ๋๋ ์ฌ์ ํ ๊ทธ n1/n2/....n(n)s์ ์ธ์คํด์ค๋น ๊ฑฐ์ ๊ฐ์ ์์ ํ์ดํ์ ์ ์ฝํ ๊ฒ์ ๋๋ค.
ํค์๋(๋๋ ๊ธฐ๋ฅ)๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํธ์ถ ์ปจํ ์คํธ๊ฐ n+1 ๊ฐ์ ์์ํ๋ฉด ๋ชจ๋ ์ด์ ๊ณผ ๊ฐ์ต๋๋ค.
ํธ์ถ ์ปจํ ์คํธ๊ฐ n๊ฐ์ ๊ฐ์ ์์ํ๋ฉด ์๋ ๋์์ด ์์๋ฉ๋๋ค.
(์ด๊ฒ์ ๋ชจ๋ ๋์ฐํ ํผ๋์ด ๋ฐ์ํ๋ n=1์ธ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉํฉ๋๋ค.)
๋ด ์์ด๋์ด๋ ์ด๋ฏธ ๋ฌด์๋ ๋ฐํ ๊ฐ์ ๊ฐ์กฐ ํ์ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ด์ ๋ํ ์๊ฐ์ ๋จ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค.
@balasanjay ์, ๋ํ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ํ ๋ก๊น
, ๋ค๋ฅธ ์ค๋ฅ์ ๋ํ ๋ค๋ฅธ ๋ฐ์(์: sql.NoRows
? ์ค๋ฅ ๋ณ์๋ก ๋ฌด์์ ํด์ผ ํฉ๋๊น?), ์ฝ์ ์ ์๋ ์ฝ๋ ๋ฑ์ด ์์ต๋๋ค. ๋
์์๊ฒ ๋ช
ํํ๊ฒ ํ๊ธฐ ์ํด ํ์ผ์ ์ฐ ์งํ์ defer f.Close()
๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ์ ์ด์ ๋ก ์ค๋ฅ๋ฅผ ์ฆ์ ํ์ธํฉ๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ด ์ ์์ด " ์ค๋ฅ๋ ๊ฐ ์ ๋๋ค"๋ผ๋ ๊ท์น์ ์๋ฐํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด Go๊ฐ ์ค๊ณ๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ์์ ๊ท์น์ ์ ๋ฉด์ผ๋ก ์๋ฐฐ๋ฉ๋๋ค.
try(errors.Wrap(err, ...))
๋ ์ด ์ ์๊ณผ ํ์ฌ Go ๋์์ธ ๋ชจ๋์ ๋ชจ์๋๊ธฐ ๋๋ฌธ์ ๋ ๋ค๋ฅธ ๋์ฐํ ์ฝ๋์
๋๋ค.
@lestrrat์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก foo() ๋ฐ bar()๋ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SomeFunctionWithGoodName(Parm1, Parms2)
์ ์๋ @mattn ๊ตฌ๋ฌธ์ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
if try(SomeFunctionWithGoodName(Parm1, Parms2)) == 1 && try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) == 2 {
}
๊ฐ๋ ์ฑ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ง์ ๋๋ค.
๋ฐํ ๊ฐ์ ๊ณ ๋ คํ์ญ์์ค.
someRetVal, err := SomeFunctionWithGoodName(Parm1, Parms2)
1 ๋๋ 2์ ๊ฐ์ const์ ๋น๊ตํ๋ ๊ฒ๋ณด๋ค ๋ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ ๋ ๋๋น ์ง์ง๋ ์์ง๋ง ์ด์ค ํ ๋น ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
if a := try(SomeFunctionWithGoodName(Parm1, Parms2)) && b:= try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) {
}
๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก("tryhard๊ฐ ๋๋ฅผ ์ผ๋ง๋ ๋์๋๊ฐ"):
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
@makhov
์ด ์ ์์ "์ค๋ฅ๋ ๊ฐ์น์ ๋๋ค"๋ผ๋ ๊ท์น์ ์๋ฐํฉ๋๋ค.
์ค๋ง. ์ค๋ฅ๋ ์ฌ์ ํ ์ด ์ ์์ ๊ฐ์
๋๋ค. try()
๋ if err != nil { return ...,err }
์ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ๋์ด ์ ์ด ํ๋ฆ์ ๋จ์ํํฉ๋๋ค. error
์ ํ์ ์ด๋ฏธ ๋ด์ฅ ์ธํฐํ์ด์ค ์ ํ์ด๊ธฐ ๋๋ฌธ์ "ํน๋ณ"ํฉ๋๋ค. ์ด ์ ์์ error
์ ํ์ ๋ณด์ํ๋ ๋ด์ฅ ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์๋ ํน๋ณํ ๊ฒ์ด ์์ต๋๋ค.
@ngrilly ๋จ์ํ? ์ด๋ป๊ฒ?
func (req *Request) Decode(r Reader) error {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
๋ฃจํ ๋ด๋ถ์์ ์ค๋ฅ๊ฐ ๋ฐํ๋์์์ ์ด๋ป๊ฒ ์ดํดํด์ผ ํฉ๋๊น? foo
๊ฐ ์๋ err
var์ ํ ๋น๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ฝ๋์ ์ ์ฅํ์ง ์๊ณ ์ผ๋์ ๋๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๊น?
@daved
๊ดํธ๋ ๋ด๊ฐ ์์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋์ฉ๋๋ค. [...] ํค์๋๋ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค๊ณผ ๋ค๋ฅธ ์ ์ ์ฝ๊ฐ ์ดํ์ค์ ์ ๋๋ค.
ํค์๋์ ๋ด์ฅ ๊ธฐ๋ฅ ์ค์์ ์ ํํ๋ ๊ฒ์ ๋๋ถ๋ถ ๋ฏธํ์ ์ด๊ณ ๊ตฌ๋ฌธ๋ก ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ์ด๊ฒ์ด ์ ๋น์ ์ ๋์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์์งํ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
์ถ์ : ๋ด์ฅ ํจ์๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๊ณ ํฅํ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ก ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ฐ์ฐ์ ์ฐ์ ์์์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค. ํค์๋๋... ํค์๋๋ผ๋ ์ฅ์ ์ด ์์ผ๋ฉฐ try
์ ํธ๋ "ํน์"ํฉ๋๋ค.
@makhov
๋จ์ํ?
ํ์ธ. ์ฌ๋ฐ๋ฅธ ๋จ์ด๋ "๋จ์ถ"์ ๋๋ค.
try()
๋ if err != nil { return ..., err }
ํจํด์ ๋ด์ฅ try()
ํจ์์ ๋ํ ํธ์ถ๋ก ๋์ฒดํ์ฌ ์ฝ๋๋ฅผ ์ค์
๋๋ค.
์ฝ๋์์ ๋ฐ๋ณต ํจํด์ ์๋ณํ๊ณ ์ ํจ์์์ ์ถ์ถํ๋ ๊ฒ๊ณผ ์ ํํ ๊ฐ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ append()์ ๊ฐ์ ๋ด์ฅ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฌ๋ผ์ด์ค์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํด์ผ ํ ๋๋ง๋ค "extenso์์" ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ฌ ๋์ฒดํ ์ ์์ต๋๋ค. ํ์ง๋ง ํญ์ ํ๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ํตํฉ๋์์ต๋๋ค. try()
๋ ๋ค๋ฅด์ง ์์ต๋๋ค.
๋ฃจํ ๋ด๋ถ์์ ์ค๋ฅ๊ฐ ๋ฐํ๋์์์ ์ด๋ป๊ฒ ์ดํดํด์ผ ํฉ๋๊น?
๋ฃจํ์ try()
๋ ๋ฃจํ ์ธ๋ถ์ ๋๋จธ์ง ํจ์์์ try()
์ ๋๊ฐ์ด ์๋ํฉ๋๋ค. readID()
๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ํจ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค(if ์ฅ์ ํ).
foo๊ฐ ์๋ err var์ ํ ๋น๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฝ๋ ์์ ์ foo
๋ณ์๊ฐ ์์ต๋๋ค...
@makhov ๋ฐํ๋ ์ค๋ฅ์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ค๋ํซ์ด ๋ถ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ ์์ ๋น ๋ฅด๊ฒ ๋ค์ ์ฝ์์ง๋ง ์๋ฌด ๊ฒ๋ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๋ณ์ ์ด๋ฆ err
์ด ๊ธฐ๋ณธ ์ด๋ฆ์ธ์ง ํ์ธํ ์ ์์์ต๋๋ค).
๋ฐํ๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ์ ์ด ์ ์์ ๊ฑฐ๋ถํ๋ ์ฌ๋๋ค์ด ์ข์ํ์ง ์๋ ํฌ์ธํธ ์ค ํ๋์ ๋๋ค.
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
@pierrec ์๋ง๋ recover()
์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์์ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น?
defer func() {err = unexpected(tryError())}
@makhov ๋ ๋ช ์์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
func (req *Request) Decode(r Reader) error {
req.Type, err := readByte(r)
try(err) // or add annotation like try(annotate(err, ...))
req.Body, err := readString(r)
try(err)
req.ID, err := readID(r)
try(err)
n, err := binary.ReadUvarint(r)
try(err)
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err := readID(r)
try(err)
}
return nil
}
@pierrec ์ข์, ๋ฐ๊ฟ๋ณด์:
func (req *Request) Decode(r Reader) error {
var errOne, errTwo error
defer func() { err = unexpected(???) }()
req.Type = try(readByte(r))
โฆ
}
@reuse ๊ทธ๋ฆฌ๊ณ ์ ์ด๊ฒ๋ณด๋ค ๋ซ์ต๋๊น?
func (req *Request) Decode(r Reader) error {
req.Type, err := readByte(r)
if err != nil { return err }
โฆ
}
์ด๋ค ์๊ฐ์ ์ฐ๋ฆฌ ๋ชจ๋๋ ๊ทธ ์งง์ ๊ฒ์ด ๊ฐ๋ ์ฑ๋ณด๋ค ๋ซ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๊น?
@flibustenet ๋ฌธ์ ๋ฅผ ์ดํดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํจ์ฌ ์ข์ ๋ณด์ด์ง๋ง ์ด ์์ "๊ฐ์ "์ ์ํด ๊นจ์ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ํ์ํ์ง ์์ง ํ์คํ์ง ์์ต๋๋ค. ์ ๋ฒ์ ์ Go์์ ๋น๋๋ฅผ ์ค์งํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ์ง์ฆ์ด ๋ฉ๋๋ค.
package main
func main() {
// ...
try("a", "b")
// ...
}
func try(a, b string) {
// ...
}
@makhov ๋๋ ์ด๊ฒ์ ๋ช
ํํ ํ ํ์๊ฐ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ณ์๋ฅผ ํ์
ํ ์ ์์ ๋ ์ปดํ์ผ๋ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น? ๊ทธ๋ด ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค.
์ ์์์์ ์ด ์ ์ ๋ช
ํํ ํด์ผ ํ์ง ์์๊น์? ์๋๋ฉด ๋ฌธ์์์ ๋๋ฝ ๋์์ต๋๊น?
@flibustenet ์, ๊ทธ๊ฒ์ try()๋ฅผ ์ฌ์ฉํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด์ง๋ง try๋ฅผ ์ฌ์ฉํ๋ ๊ด์ฉ์ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@cespare ๋น์ ์ด ์์ฑํ ๊ฒ์ผ๋ก๋ถํฐ defer์ ๋ฐํ ๊ฐ ์์ ์ try
์ ๊ธฐ๋ฅ์ด์ง๋ง ์ด๋ฏธ ํ ์ ์์ต๋๋ค.
https://play.golang.com/p/ZMauFmt9ezJ
(๋ง์ํ์ ๋ด์ฉ์ ์ ๊ฐ ์๋ชป ์ดํดํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค)
@jan-g ๊ด๋ จ https://github.com/golang/go/issues/32437#issuecomment -507961463: ๋์ ๋ณด์ด์ง ์๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ์์ด๋์ด๊ฐ ์ฌ๋ฌ ๋ฒ ๋์์ต๋๋ค. ์ด๋ฌํ ์์์ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๋ ํธ์ถ๋ ํจ์์ ์ค๋ฅ ๋ฐํ์ ์ถ๊ฐํ๋ฉด ํธ์ถํ๋ ํจ์๊ฐ ์๋์ผ๋ก ๋ณด์ด์ง ์๊ฒ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ๊ฐ ํ์ธ๋ ๋ ์ฐ๋ฆฌ๋ ์ ๋์ ์ผ๋ก ๋ช ์ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ฌต์์ ์ ๊ทผ์ ๋ํ ๋ชจ๋ ๊ฒ์ด ๋ช ์์ ์ด๋ผ๋ Go์ ์ผ๋ฐ ์์น์ ์๋ฐฐ๋ฉ๋๋ค.
@griesemer
๋ด ํ๋ก์ ํธ(https://github.com/komuw/meli) ์ค ํ๋์์ tryhand
๋ฅผ ์๋ํ์ง๋ง ์๋ฌด ๋ณํ๊ฐ ์์์ต๋๋ค.
gobin github.com/griesemer/tryhard
Installed github.com/griesemer/[email protected] to ~/go/bin/tryhard
```๋ฐฐ์
~/go/bin/tryhard -err "" -r
0
most of my err handling looks like;
```Go
import "github.com/pkg/errors"
func CreateDockerVolume(volName string) (string, error) {
volume, err := VolumeCreate(volName)
if err != nil {
return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
}
return volume.Name, nil
}
@komuw ์ฐ์ tryhard
ํ์ผ ์ด๋ฆ์ด๋ ๋๋ ํ ๋ฆฌ ์ธ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ณตํด์ผ ํฉ๋๋ค.
tryhard -err="" -r . // <<< note the dot
tryhard -err="" -r filename
๋ํ ์ฃผ์์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ฝ๋๋ if
๋ธ๋ก์์ ํน์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฏ๋ก ๋ค์ ์์ฑ๋์ง ์์ต๋๋ค. ์ธ์ ์ ์ฉ๋๋์ง๋ tryhard
๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์ญ์์ค. ๊ฐ์ฌ ํด์.
func CreateDockerVolume(volName string) (string, error) {
volume, err := VolumeCreate(volName)
if err != nil {
return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
}
return volume.Name, nil
}
์ด๊ฒ์ ๋ค์ ํฅ๋ฏธ๋ก์ด ์์ ๋๋ค. ๊ทธ๊ฒ์ ๋ณผ ๋ ๋์ ์ฒซ ๋ฒ์งธ ๋ฐ์์ ์ด๊ฒ์ด ๋ค์๊ณผ ๊ฐ์ ๋ง๋๋ฌ ์ค๋ฅ ๋ฌธ์์ด์ ์์ฑํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฌป๋ ๊ฒ์ด์์ต๋๋ค.
unable to create docker volume: VolumeName: could not create volume VolumeName: actual problem
๋๋ต์ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด VolumeCreate
ํจ์(๋ค๋ฅธ ๋ฆฌํฌ์งํ ๋ฆฌ์์)๋ ๋ค์๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) {
var volume types.Volume
resp, err := cli.post(ctx, "/volumes/create", nil, options, nil)
defer ensureReaderClosed(resp)
if err != nil {
return volume, err
}
err = json.NewDecoder(resp.body).Decode(&volume)
return volume, err
}
์ฆ, ๊ธฐ๋ณธ ํจ์๊ฐ ์ค๋ฅ๋ฅผ ์ฅ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ์ ๋ํ ์ถ๊ฐ ์ฅ์์ด ์ ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ try
๋ก ์ฝ๊ฐ ๋จ์ํํ ์ ์์ต๋๋ค.
์๋ง๋ VolumeCreate
ํจ์๋ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๊ณ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ CreateDockerVolume
ํจ์๊ฐ ์ ๊ณตํ ์๋ก์ด ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ ์ฅ์์ ์ถ๊ฐํด์ผ ํ๋์ง ๋ช
ํํ์ง ์์ต๋๋ค.
@neild
VolumeCreate
๊ฐ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋๋ผ๋ ์ฅ์์ ์ถ๊ฐํ๋ ค๋ฉด ์ฌ์ ํ CreateDockerVolume
๊ฐ ํ์ํฉ๋๋ค. VolumeCreate
๋ ๋ค์ํ ๋ค๋ฅธ ํจ์์์ ํธ์ถ๋ ์ ์๊ณ ๋ฌด์ธ๊ฐ๊ฐ ์คํจํ๋ฉด ๊ธฐ๋ก๋จ) ๋ฌด์์ด ์คํจํ๋์ง ์๊ณ ์ถ์ต๋๋ค. ์ด ๊ฒฝ์ฐ CreateDockerVolume
์
๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ VolumeCreate
๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ APIclient ์ธํฐํ์ด์ค์ ์ผ๋ถ์
๋๋ค.
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค os.Open
๋ ํ์ผ ์ด๋ฆ, ์ค๋ฅ ์ด์ ๋ฑ์ ์ ๊พธ๋ฐ ์ ์์ง๋ง
func ReadConfigFile(...
func WriteDataFile(...
๊ธฐํ - os.Open
ํธ์ถ์ ์ค๋ฅ๋ฅผ ๊ธฐ๋ก, ์ถ์ ๋ฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ณด๊ณ ์ถ์ ์ค์ ์คํจ ๋ถ๋ถ์
๋๋ค. ํนํ ํ๋ก๋์
ํ๊ฒฝ์์๋ง์ด ์๋๋๋ค.
@neild ๊ฐ์ฌํฉ๋๋ค.
์ด ์ค๋ ๋๋ฅผ ํ์ ์ํค๊ณ ์ถ์ง๋ ์์ง๋ง...
์๋ง๋ VolumeCreate ํจ์๋ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๊ณ ์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ๊ฒฝ์ฐ์๋
CreateDockerVolume ํจ์
์ถ๊ฐ ์ฅ์์ ์ถ๊ฐํด์ผ ํ๋ฉฐ,
๋ฌธ์ ๋ CreateDockerVolume
ํจ์์ ์์ฑ์๋ก์ ๋ด๊ฐ
VolumeCreate
์ ์์ฑ์๊ฐ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋์ง ์ฌ๋ถ๋ฅผ ์๊ณ
๋ด ๊ฒ์ ์ฅ์ํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์์๋๋ผ๋ ๊ทธ๋ค์ ๊ทธ๋ค์ ์ฅ์์ ์ทจ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ ์์์ต๋๋ค.
์ดํ ๋ฒ์ ์์ ๊ธฐ๋ฅ. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ณ๊ฒฝ์ API ๋ณ๊ฒฝ์ด ์๋๊ธฐ ๋๋ฌธ์
ํจ์น/๋ง์ด๋ ๋ฒ์ ์ผ๋ก ์ถ์ํ๊ณ ์ด์ ๋ด ๊ธฐ๋ฅ์
๋ฐ์ฝ๋ ์ดํ
๋ ์ค๋ฅ๊ฐ ์๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ชจ๋
๋ด๊ฐ ํ์ํ ์ ๋ณด.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ
ํตํ๊ฐ ์ด๋ฏธ ๋ํ๋์์ต๋๋ค.
์ง์ฅ๋๋ฃ์ try
์๊ธฐ๋ฅผ ๋๋๋ค๊ฐ ๋ฌธ๋ ์ด๋ฐ ์๊ฐ์ด ๋ค์๋ค. ์๋ง๋ try
๋ 1.14์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์๋ง ํ์ฑํ๋์ด์ผ ํฉ๋๋ค. @crawshaw ์ @jimmyfrasche ๋ ๋ชจ๋ ๋ช ๊ฐ์ง ์ฌ๋ก๋ฅผ ๋น ๋ฅด๊ฒ ๋๋ฌ๋ณด๊ณ ๋ช ๊ฐ์ง ๊ด์ ์ ์ ์ํ์ง๋ง ์ค์ ๋ก ๊ฐ๋ฅํ ํ try
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๋ ๊ฒ์ ๊ฐ์น๊ฐ ์์์ต๋๋ค.
์ด๋ฅผ ํตํด Go ํ์ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ํ์ง ์์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์์ฑํ ์ ์๊ณ ์ปค๋ฎค๋ํฐ๋ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ์ผ๋ง๋ ์์ฃผ ์ฌ์ฉ๋๋์ง, ์ผ๋ง๋ ์์ฃผ defer
์ ํ์ด๋งํด์ผ ํ๋์ง, ์ฝ๋ ๊ฐ๋
์ฑ์ ๋ณ๊ฒฝํ๋์ง, tryhard
๊ฐ ์ผ๋ง๋ ์ ์ฉํ์ง ๋ฑ์ ์ ์ ์์ต๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ ์ ์ฝ๊ฐ ์ด๊ธ๋๋ฏ๋ก ์ผ๋ฐ Go ์ฝ๋์์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง try
๊ฐ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง ๋ณผ ์ ์๋ ๋์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ์ด๋ฏธ ์ด๊ฒ์ ์๊ฐํ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๋๋ ๋ค์ํ ํ ๋ก ์ ๊ฑฐ์ณค๊ณ ๋น์ทํ ์ ์์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ๋ ๊ฒ์ ์์์ต๋๋ค. ์ ๋ ๊ทํ์ ์ค๋ฌธ์กฐ์ฌ์ ์ฐธ์ฌํ์ผ๋ฉฐ ์ด๊ฒ์ด ์๋๋ผ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ์ ํฌํํ์ต๋๋ค.
๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ด ๋ ์๊ฒฉํ๊ฒ๋ณด๊ณ ์ถ์ต๋๋ค.
@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ฝํ์๋ฉด:
if ... { return err }
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 2์ค).๋จ์ง ์ธ๊ด์์ ๋ณ๊ฒฝ์ผ๋ก ๋ณด์ด๋ ์ด ์ฝ 6,000๊ฐ์ ๊ต์ฒด: ๊ธฐ์กด ์ค๋ฅ๋ฅผ ๋ ธ์ถํ์ง ์๊ฑฐ๋ ์๋ก์ด ์ค๋ฅ๋ฅผ ๋์ ํ์ง ์์ ๊ฒ์ ๋๋ค(๋ ์ค ํ๋๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ ์์ ํด ์ฃผ์ธ์.)
๋ด๊ฐ ๋ฉ์ธํ
์ด๋์ ์๊ฒฉ์ผ๋ก ๋ด ์์ ์ ์ฝ๋๋ก ์ด๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๊ท์ฐฎ๊ฒ ํ ๊ฒ์ธ๊ฐ? ๊ต์ฒด ๋๊ตฌ๋ฅผ ์ง์ ์์ฑํ์ง ์๋ ํ ์๋๋๋ค. golang/go
์ ์ฅ์์ ์ ํฉํฉ๋๋ค.
PS CL์ ํฅ๋ฏธ๋ก์ด ๋ฉด์ฑ ์กฐํญ:
... Some transformations
may be incorrect
due to the limitations of the
tool (see https://github.com/griesemer/tryhard)...
xerrors
์ ๊ฐ์ด ํ์ฌ ํจํค์ง๋ก ์ฌ์ฉํ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ฅผ ์ํํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์๋ฅผ ๋ค์ด ์๋ ํจํค์ง๋ฅผ ์ฌ์ฉํด ๋ณด์ญ์์ค.
https://github.com/junpayment/gotry
ํ์ง๋ง ์๋ ์์ฒด๊ฐ ์ข์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์๋ ์ํฅ๋ ฅ์ด ๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
===
์ ์ณ๋๊ณ , ๋ด๊ฐ ์๋ํ๋ ๊ฒ์ ๋ํด ๋ ๊ฐ์ง ๊ฑฑ์ ๋๋ ๊ฒ์ด ์์ต๋๋ค.
1. ํ์ ์๋ตํ ์ ์๋ค๋ ์๊ฒฌ์ด ์์ผ๋, defer(๋๋ ํธ๋ค๋ฌ) ์ ์ ๋ํ ๊ณ ๋ ค๋ ์๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์๋ฅผ ๋ค์ด, ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ธ๋ถ์ ์ธ ๊ฒฝ์ฐ.
foo, err: = Foo ()
if err! = nil {
if err.Error () = "AAA" {
some action for AAA
} else if err.Error () = "BBB" {
some action for BBB
} else if err.Error () = "CCC" {
some action for CCC
} else {
return err
}
}
์ด๊ฒ์ ๋จ์ํ try๋ก ๋ฐ๊พธ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
handler: = func (err error) {
if err.Error () = "AAA" {
some action for AAA
} else if err.Error () = "BBB" {
some action for BBB
} else if err.Error () = "CCC" {
some action for CCC
} else {
return err
}
}
foo: = try (Foo (), handler)
2. ์ค์๋ก ์ค๋ฅ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ค๋ฅธ ๋์ ํจํค์ง๊ฐ ์์ ์ ์์ต๋๋ค.
type Bad struct {}
func (bad * Bad) Error () {
return "i really do not intend to be an error"
}
@junpayment gotry
ํจํค์ง์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค - try
์ ๋ํ ๋๋์ ์ฝ๊ฐ ์ป๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด์ง๋ง Try
๋ฅผ ๋ชจ๋ type-assertํด์ผ ํ๋ ๊ฒ์ ์ฝ๊ฐ ์ฑ๊ฐ์ค ๊ฒ์
๋๋ค. interface{}
์ ๊ฒฐ๊ณผ์
๋๋ค.
๊ทํ์ ๋ ๊ฐ์ง ์ง๋ฌธ์ ๋ํด:
1) ๋๋ ๋น์ ์ด ์ด๊ฒ์ ๊ฐ์ง๊ณ ์ด๋๋ก ๊ฐ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. try
๊ฐ ๊ทํ์ ์์์์ ๊ฐ์ด ํธ๋ค๋ฌ๋ฅผ ์๋ฝํด์ผ ํ๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๊น? (๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ try
์ ์ด์ ๋ด๋ถ ๋ฒ์ ์์ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ ?)
2) ์ค์๋ก ์ค๋ฅ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ก์ด ๊ฒ์ด ์๋๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์๋ ํ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ์ด๋์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ด๊ฐ ์์ฌํ๋ ๊ฒ์ ํ์ธ์์ผ์ค๋๋ค. go ์์ค ์ฝ๋ ์์ฒด์๋ ์ค๋ฅ๊ฐ ๋ฐฉ๊ธ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ try()
๊ฐ ์ ์ฉํ ๋ง์ ๊ณณ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ ์ ์ถํ tryhard
์คํ์์ ์ ์ ์๋ฏ์ด ๋ค๋ฅธ ๋ง์ ์ฝ๋๋ฒ ์ด์ค์ ๊ฒฝ์ฐ try()
๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ค๋ฅ๊ฐ ์ค์ ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
Go ๋์์ด๋๊ฐ ์ผ๋์ ๋์ด์ผ ํ ์ฌํญ์ธ ๊ฒ ๊ฐ์์. go ์ปดํ์ผ๋ฌ์ ๋ฐํ์์ Go ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ ๋ค๋ฅธ "๊ณ ์ ํ" Go ์ฝ๋์
๋๋ค. ๋ฐ๋ผ์ try()
๋ ์ค๋ฅ๊ฐ ์ค์ ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๊ณ defer ๋ฌธ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์ด ์ค์ ๋ก ๋ฐ๋์งํ์ง ์์ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ ์ฉํ๋๋ก ํฅ์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@griesemer
์ค์ ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์์ ๋ชจ๋ Try ๊ฒฐ๊ณผ๋ฅผ ์ ํ ์ด์ค์ ํด์ผ ํ๋ ๊ฒ์{} ๋ค์ ์ฑ๊ฐ์ค ๊ฒ์ ๋๋ค.
๋ค๊ฐ ์ณ์. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํธ์ถ์๊ฐ ํ์์ ์บ์คํ ํด์ผ ํฉ๋๋ค.
๋น์ ์ด ์ด๊ฒ์ ๊ฐ์ง๊ณ ์ด๋๋ก ๊ฐ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทํ์ ์์์์ ๊ฐ์ด try๊ฐ ํธ๋ค๋ฌ๋ฅผ ์๋ฝํด์ผ ํ๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๊น? (๊ทธ๋ฆฌ๊ณ ์ด์ ๋ด๋ถ ๋ฒ์ ์ try?)
์ ๊ฐ ์ค์๋ฅผ. ํธ๋ค๋ฌ๊ฐ ์๋ defer๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ช ํ์ด์ผ ํฉ๋๋ค. ์ฃ์ก ํด์.
์ ๊ฐ ๋งํ๊ณ ์ ํ๋ ๋ฐ๋ ์๋ต๋ ์ค๋ฅ ์ฒ๋ฆฌ ๊ณผ์ ์ผ๋ก ์ธํด ์ฝ๋ ์์ ๊ธฐ์ฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์๋ค๋ ์ ์ ๋๋ค.
์ค๋ฅ๋ฅผ ์์ธํ ๋ค๋ฃจ๊ณ ์ ํ ๋ ๊ทธ ์ํฅ์ ๋์ฑ ๋๋๋ฌ์ง ๊ฒ์ผ๋ก ์์๋๋ค.
๋ฐ๋ผ์ ์ฝ๋ ์ค ์๋ฅผ ์ค์ด๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ์์น๋ฅผ ๊ตฌ์ฑํ๋ ์ ์์ ์ดํดํ ์ ์์ต๋๋ค.
์ค์๋ก ์ค๋ฅ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ก์ด ๊ฒ์ด ์๋๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์๋ ํ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ํํ๋ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค.
@beoran Go Corpus(https://github.com/rsc/corpus)์ ์ด๊ธฐ ๋ถ์์ ์ํํ์ต๋๋ค. ํ์ฌ ์ํ์ tryhard
๋ ๋ง๋ญ์น์์ ๋ชจ๋ err != nil
๊ฒ์ฌ์ 41.7%๋ฅผ ์ ๊ฑฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. "_test.go" ํจํด์ ์ ์ธํ๋ฉด ์ด ์์น๋ 51.1%๋ก ์ฆ๊ฐํฉ๋๋ค( tryhard
๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์์์๋ง ์๋ํ๋ฉฐ ํ
์คํธ์์ ๋ง์ ๊ฒ์ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค). ์ฃผ์ํ ์ ์ ์ด ์ซ์๋ฅผ ์ฝ๊ฐ์ ์๊ธ์ผ๋ก ์ทจํ๋ฉด $ tryhard
์ ํดํน๋ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ(์: ์ฝ๋์์ err != nil
๊ฒ์ฌ๋ฅผ ์ํํ๋ ์์น์ ์)๋ฅผ ์ป์์ต๋๋ค. tryhard
๊ฐ ์ด๋ฌํ ํต๊ณ ์์ฒด๋ฅผ ๋ณด๊ณ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ์ต๋๋ค.
๋ํ tryhard
๊ฐ ์ ํ์ ์ธ์ํ๊ฒ ๋๋ฉด ์ด๋ก ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ณํ์ ์ํํ ์ ์์ต๋๋ค.
// Before.
a, err := foo()
if err != nil {
return 0, nil, errors.Wrapf(err, "some message %v", b)
}
// After.
a, err := foo()
try(errors.Wrapf(err, "some message %v", b))
์ด๊ฒ์ error.Wrap์์ ์ ๋ฌ๋ ์ค๋ฅ ์ธ์๊ฐ nil
๋ nil
๋ฅผ ๋ฐํํ๋ ๋์์ ์ด์ฉํฉ๋๋ค. (github.com/pkg/errors๋ ์ด์ ๊ด๋ จํ์ฌ ๊ณ ์ ํ์ง ์์ต๋๋ค. ์ค๋ฅ ๋ํ์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ nil
์ค๋ฅ๋ฅผ ๋ณด์กดํ๊ณ ๋๋ถ๋ถ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ํจํด์ผ๋ก ์๋ํฉ๋๋ค. ํฌ์คํธ- try
, ๋๋ ์์ํ๋ค). ์๋ก์ด ์ธ๋์ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ง๋ ์ด๋ฌํ ์ ํ ๋์ฐ๋ฏธ์ ์ด๋ฆ์ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์ง์ ํ ๊ฒ์
๋๋ค.
์ด๊ฒ์ด ๋น ํ
์คํธ err != nil
์ฒดํฌ ์์์ 50%์ ์ ์ฉ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ํจํด์ ์ง์ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์งํ ์ ์ ์ ์ํ ๋๋ก Go ์ปดํ์ผ๋ฌ์ ๋ฐํ์์ด ๊ณ ์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. .
CreateDockerVolume
https://github.com/golang/go/issues/32437#issuecomment -508199875 ์์ ์ ๋ณด
๋๋ ์ ํํ ๊ฐ์ ์ข
๋ฅ์ ์ฌ์ฉ๋ฒ์ ์ฐพ์์ต๋๋ค. lib์์ ๊ฐ ์ค๋ฅ์ ์ปจํ
์คํธ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๊ณ lib๋ฅผ ์ฌ์ฉํ ๋ try
$๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ฒด ๊ธฐ๋ฅ์ ๋ํด defer
์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
์์ํ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์ด๊ฒ์ ๋ชจ๋ฐฉํ๋ ค๊ณ ์๋ํ์ง๋ง ์ ์๋ํฉ๋๋ค.
func MyLib() error {
return errors.New("Error from my lib")
}
func MyOtherLib() error {
return errors.New("Error from my otherLib")
}
func Caller(a, b int) error {
eh := func(err error) error {
return fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, err)
}
err := MyLib()
if err != nil {
return eh(err)
}
err = MyOtherLib()
if err != nil {
return eh(err)
}
return nil
}
try+defer
๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฅญํ๊ณ ๊ด์ฉ์ ์ผ๋ก ๋ณด์ผ ๊ฒ์
๋๋ค.
func Caller(a, b int) (err error) {
defer fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, &err)
try(MyLib())
try(MyOtherLib())
return nil
}
@griesemer
๋์์ธ ๋ฌธ์์๋ ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ต๋๋ค.
๋๋ฌ์ธ๋ ํจ์๊ฐ ๋ค๋ฅธ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ ์ด๋ค ๊ฐ์ด๋ ์ ์งํฉ๋๋ค. ํจ์๊ฐ ์ด๋ฆ ์๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋นํ๋ 0 ๊ฐ์ ๊ฐ์ ํฉ๋๋ค(์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ์ ์งํ๋ ๊ฒ๊ณผ ๋์ผ).
์ด๋ ์ด ํ๋ก๊ทธ๋จ์ด https://play.golang.org/p/KenN56iNVg7์์ 0 ๋์ 1์ ์ธ์ํจ์ ์๋ฏธํฉ๋๋ค.
Twitter์์ ๋์๊ฒ ์ง์ ํ๋ฏ์ด ์ด๊ฒ์ try
๊ฐ ๋ฐํ๋๋ ๊ฐ์ด ์์์ ์ธ ์๋ชธ ๋ฐํ์ฒ๋ผ ์๋ํ๋๋ก ํฉ๋๋ค. ๋ฐํ๋๋ ์ค์ ๊ฐ์ ํ์
ํ๋ ค๋ฉด try
์์ฒด์ ๋ํ ํธ์ถ์์ ์๋นํ ๊ฑฐ๋ฆฌ๋ฅผ ๋๊ณ ์ฝ๋๋ฅผ ์ดํด๋ด์ผ ํ ์ ์์ต๋๋ค.
์ด ๋ค์ดํค๋ ๋ฆฌํด(non-locality) ์์ฑ์ด ์ผ๋ฐ์ ์ผ๋ก ์ซ์ดํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ try
๊ฐ ํญ์ ์ค๋ฅ๊ฐ ์๋ ์ธ์์ 0 ๊ฐ์ ๋ฆฌํดํ๋๋ก ํ๋ ๊ฒ์ ๋ํ ๊ทํ์ ์๊ฐ์ ๋ฌด์์
๋๊น(์ ํ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ)?
๋ช ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ:
์ด๋ก ์ธํด ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์ ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ์ผ๋ถ ํจํด์ด try
๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ถ๋ถ ์ฐ๊ธฐ ์ํฉ์์๋ ์์ฑ๋ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํด์ผ ํ๋ io.Writer
๊ตฌํ์ ๊ฒฝ์ฐ. ์ฆ, try
๋ ์ด์จ๋ ์ด ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค(์: n += try(wrappedWriter.Write(...))
๋ ์ค๋ฅ ๋ฐํ์ ๊ฒฝ์ฐ n
๋ฅผ ์ฌ๋ฐ๋ฅธ ์ซ์๋ก ์ค์ ํ์ง ์์ต๋๋ค). ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ฐ๊ณผ ์ค๋ฅ๊ฐ ๋ชจ๋ ํ์ํ ์๋๋ฆฌ์ค๋ ๋ค์ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข
๋ฅ์ ์ฌ์ฉ ์ฌ๋ก์์๋ try
๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
try
๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ์ปค์ง ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ถ๋ ฅ ๋ณ์๋ฅผ 0์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ ํจ์์ ์์น๊ฐ ๋ง์ด ์์ต๋๋ค. ์ฒซ์งธ, ์ปดํ์ผ๋ฌ๋ ์์ฆ ๋ถํ์ํ ์ฐ๊ธฐ๋ฅผ ์ต์ ํํ๋ ๋ฐ ๊ฝค ๋ฅ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ๋ก, ํ์ํ๋ค๊ณ ํ๋ช
๋๋ฉด ๋ชจ๋ try
-generated ๋ธ๋ก goto
์ ๊ณตํต ๊ณต์ ๊ธฐ๋ฅ ์ ์ฒด ๋ ์ด๋ธ์ ํฌํจํ๋ ๊ฒ์ด ๊ฐ๋จํ ์ต์ ํ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด ๋ ์ด๋ธ์ ์ค๋ฅ๊ฐ ์๋ ์ถ๋ ฅ ๊ฐ์ 0์ผ๋ก ๋ง๋ญ๋๋ค.
๋ํ ์๊ณ ๊ณ์๊ฒ ์ง๋ง tryhard
๋ ์ด๋ฏธ ์ด๋ฐ ์์ผ๋ก ๊ตฌํ๋์ด ์์ผ๋ฏ๋ก ๋ถ์์ ์ธ ์ด์ ์ผ๋ก tryhard
๊ฐ ๋ ์ ํํด์ง๋๋ค.
@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ์ด๋์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ด๊ฐ ์์ฌํ๋ ๊ฒ์ ํ์ธ์์ผ์ค๋๋ค. go ์์ค ์ฝ๋ ์์ฒด์๋ ์ค๋ฅ๊ฐ ๋ฐฉ๊ธ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์
try()
๊ฐ ์ ์ฉํ ๋ง์ ๊ณณ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ ์ ์ถํtryhard
์คํ์์ ์ ์ ์๋ฏ์ด ๋ค๋ฅธ ๋ง์ ์ฝ๋๋ฒ ์ด์ค์ ๊ฒฝ์ฐtry()
๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ค๋ฅ๊ฐ ์ค์ ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
๋๋ ์ด๊ฒ์ ๋ค๋ฅด๊ฒ ํด์ํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์ ๋ค๋ฆญ์ด ์์๊ธฐ ๋๋ฌธ์ ์์ฑ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ค๋ฆญ์ ์ง์ ์ ์ธ ์ด์ ์ ์ป์ ์ ์๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ์ ๋ค๋ฆญ์ด ์ ์ฉํ์ง ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๋๋ฅผ ์ํด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋์์ ์ฌ์ฉํ ๋ ๊ฐ์ง ํจํด์ด ์์ต๋๋ค.
์ด๋ฌํ ํจํด์ ๋๋ฆฌ ํผ์ ธ ์์ง๋ ์์ง๋ง ์๋ํฉ๋๋ค. 1) ๋ด๋ณด๋ด์ง ์์ ํจ์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋๋ฉฐ 2) ์ง๋ ๋ช ๋ ๋์ ๋ด ์ฝ๋๋ฒ ์ด์ค์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋์์ต๋๋ค. ์๋ํ๋ฉด ์ง๊ต ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋จ์ํ๋ ์ค๋ฅ ์ฅ์์ ์ํํ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๊ทผ์ ์ถ๋ณตํ์ต๋๋ค. ๊ทธ๋ค์ด ๋๋ฆฌ ํผ์ ธ ์์ง ์๋ค๋ ์ฌ์ค์ด ๊ทธ๋ค์ด ์ข์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Go ํ์์ ๊ถ์ฅํ๋ ์ง์นจ ์ ๋ฐ๋ผ ์์ผ๋ก ์ค์ ๋ก ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฃผ์ํ ์ ์ ์ฝ๋์ ๋ชจ๋ ์ค์์ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒ์ด ํ๋นํ ๊ณณ์ด ์๊ณ ๊ทธ๋ ์ง ์์ ๊ณณ์ด ์์ต๋๋ค. ์ด์ ์๋ ํ๋ฅญํ ์ง์นจ์ด ์์๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ ํญ์ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํจํค์ง ๋ด์์ "unable to open file: conf.json" ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ผ์ด ์ด๋ฆฌ์ง ์์ ๋๋ง๋ค ํญ์ ์ฅ์ํ๋ ๊ฒ์ ๋ง์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ์ง ์์ ์ ์์ต๋๋ค. "unable ์ฌ์ฉ์ ์ด๋ฆ์ ์ป์ผ๋ ค๋ฉด: db ์ฐ๊ฒฐ์ ์ป์ ์ ์์ต๋๋ค: ์์คํ ํ์ผ์ ๋ก๋ํ ์ ์์ต๋๋ค: ํ์ผ์ ์ด ์ ์์ต๋๋ค: conf.json".
์ค๋ฅ ๊ฐ๊ณผ ๊ฐ๊ฒฐํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์กฐํฉ์ผ๋ก ์ด์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋์ ์ง์นจ์ ์ป๊ณ ์์ต๋๋ค. ์ ํธ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ try ์ ์์ ๋ชฉํ์ ๊ทธ๊ฒ์ด ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋์ ์์ค์ ๊ฒ๋ค์ ๊ณ์ ๊ฐ๊ณผํ๊ณ ์๋ค๊ณ ๋๋ผ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ฌ์ ํ 1)์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด์ ์๋ ๋ ๋์ ์ง์นจ์ด ์์๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ๋๋ค์ด 1) ์ฃผ์์์ ์์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ ์์ํ ํ์ ๊ทธ๋ค์ ๋ถ์ ์ ์ธ ๋ฐ์์ด ๋ ๊ธ์ ์ ์ผ๋ก ๋ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด 2)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ง๋ ๋๋์ง์ ๋ํด์๋ ์ด๊ฒฌ์ด ์์ ์ ์์ง๋ง ์ฝ๋๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ง๋๋ ์๋ฅผ ๋ค์์ต๋๋ค.
var u user = try(db.LoadUser(try(strconv.ParseInt(stringId)))
์์ธ๊ฐ ํ์ค์ธ Java์์๋ ๋ค์์ ์ํํฉ๋๋ค.
User u = db.LoadUser(Integer.parseInt(stringId)))
์๋ฌด๋ ์ด ์ฝ๋๋ฅผ ๋ณด๊ณ 2์ค๋ก ํด์ผ ํ๋ค๊ณ ๋งํ์ง ์์ ๊ฒ์ ๋๋ค.
int id = Integer.parseInt(stringId)
User u = db.LoadUser(id))
try ๋ ์ธ๋ผ์ธ์ผ๋ก ํธ์ถ๋์ง ์์์ผ ํ๊ณ ํญ์ ์์ฒด ๋ผ์ธ์ ์์ด์ผ ํ๋ค๋ ์ง์นจ์ ๋ฐ๋ผ ์ฌ๊ธฐ์์ ๊ทธ๋ ๊ฒ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ํ ์ค๋๋ ๋๋ถ๋ถ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
var u user
var err error
var id int
id, err = strconv.ParseInt(stringId)
if err != nil {
return u, errors.Wrap("cannot load userid from string: %s: %v", stringId, err)
}
u, err = db.LoadUser(id)
if err != nil {
return u, errors.Wrap("cannot load user given user id: %d: %v", id, err)
}
// now work with u
์ด์ ์ด๊ฒ์ ์ฝ๋ ์ฌ๋์ ์ด 10์ค์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํฉ๋๋ค. ์ด 10์ค์ Java์์ 1์ค์ด์๊ณ ์ฌ๊ธฐ์์ ์ ์๊ณผ ํจ๊ป 1์ค์ด ๋ ์ ์์ต๋๋ค. ์ด ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ฌ๊ธฐ์ ์๋ ์ด๋ค ์ค์ด ์ ๋ง ์ ์ ํ์ง ์๊ฐ์ ์ผ๋ก ์ ์ ์ ์ผ๋ก ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ์์ฉ๊ตฌ๋ ์ด ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋๋ ๊ณผ๊ฑฐ ์ํ์์ ์๋ฐ์์ ์ธก๋ฉด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ ํ๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ๊ทธ๊ณณ์์ ๋ชฉํ๋
์ด๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง(์: ๋ก๊น )์ ํต์ฌ์ด ์๋ ๋์์ ๊ธฐ๋ฅ์ ํต์ฌ์ธ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๊ณ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. (wikipedia https://en.wikipedia.org/wiki/Aspect-oriented_programming์์ ์ธ์ฉ).
์ค๋ฅ ์ฒ๋ฆฌ๋ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ์ค์ฌ์ด ์๋๋ผ ์ ํ์ฑ์ ์ค์ฌ์ ๋๋ค. ์์ด๋์ด๋ ๋์ผํฉ๋๋ค. " ํ์ง๋ง ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ์ค์ ํ๊ธฐ ๋๋ฌธ์" ๋น์ฆ๋์ค ๋ก์ง์ ์ค์ฌ์ด ์๋ ๊ฒ์ผ๋ก ์ฝ๋๋ฅผ ์ด์ง๋ฝํ๋ฉด ์ ๋ฉ๋๋ค. ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์ ๋ ์ ์์ต๋๋ค.
4)์ ๊ด๋ จํ์ฌ ๋ง์ ์ ์์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ํ๋๋ฐ ์ด๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ง๋ฝํ์ง ์๋ ์ฝ๋์ ๋๋ค. ์ด๊ธฐ ์ ์์๋ ์ด์ ๋ํ ํธ๋ค ํค์๋๊ฐ ์์ผ๋ฉฐ ์ฌ๋๋ค์ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ์ต๋๋ค. ์ด ์ ์์ ์ง์ฐ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ ์ ์์ผ๋ฉฐ ์ด์ ์ ์ํฌ๋ ์ค๊ฑด์ด์๋ ์๋๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค๊ณ ๋งํฉ๋๋ค. ๋๋ ์์ - ๋๋ go ํ์ ์ฐ๊ธฐ ๋ฉ์ปค๋์ฆ ์ฑ๋ฅ์ ๋ํด ์ฌ๋ฌ ๋ฒ ์๋ฆฌ๋ฅผ ์ง๋ ๋ค.
tryhard
๋ ์ด ์ฝ๋๋ฅผ ๋จ์ํํ ์ ์๋ ๊ฒ์ผ๋ก ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ try
๋ฐ ์๋ก์ด ์ง์นจ์ ํตํด ์ฌ๋๋ค์ ์ด ์ฝ๋๋ฅผ 1์ค๋ก ๋จ์ํํ๊ณ ์ค๋ฅ ํ๋ ์์ด ํ์ํ ์ปจํ
์คํธ๋ฅผ ์บก์ฒํ๋๋ก ํ ์ ์์ต๋๋ค.
์์ธ ๊ธฐ๋ฐ ์ธ์ด์์ ๋งค์ฐ ์ ์ฌ์ฉ๋ ์ปจํ ์คํธ๋ ์ฌ์ฉ์ ID๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ stringId๊ฐ ์ ์ ID๊ฐ ๋ ์ ์๋ ํ์์ด ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ฅผ ๋ก๋ํ๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ์บก์ฒํฉ๋๋ค. ๊ทธ๊ฒ์์ ๊ตฌ๋ฌธ ๋ถ์.
์ด๋ฅผ Error Formatter์ ๊ฒฐํฉํ๋ฉด ์ด์ ๋ง์ ์ฌ๋๋ค์ด ์ํํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ํ์ง ์์ ์ฝ๊ธฐ ์ด๋ ค์ด a: b: c: d: e: underlying error
์คํ์ผ ์์ด ์ค๋ฅ ํ๋ ์๊ณผ ์ค๋ฅ ์์ฒด๋ฅผ ํ๋ถํ๊ฒ ๊ฒ์ฌํ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ฉ์์ง ํ์์ ๋ฉ์ง๊ฒ ์ง์ ํ ์ ์์ต๋๋ค. ์ ๋ํ ํ๋ฅญํ ์ง์นจ์ด ์์์ต๋๋ค.
์ด ๋ชจ๋ ์ ์์ด ํจ๊ป ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์๋ฃจ์ ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ๋ถํ์ํ ์์ฉ๊ตฌ ์์ด ๊ฐ๊ฒฐํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋์์ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ์ง๋จ๊ณผ ๋ ๋์ ์ค๋ฅ ํ์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ค์ ์ง๊ต ๊ฐ๋ ์ด์ง๋ง ํจ๊ปํ๋ฉด ๋งค์ฐ ๊ฐ๋ ฅํด์ง๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ 3)์์ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ ์์ ๋ฐ๋ฅด๋ฉด ํค์๋๋ ์์ผ๋ก ์ด๋ฆ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ํ์ฅ ์ค๋ฅ ์ฅ์์ ํ์ฉํ๊ฑฐ๋ (๋ฐํ ์๋ฏธ๋ก ๋์ ) goto ์๋ฏธ๋ก ์ ์ง์ํ๋ ํ์ฅ์ ํ์ฉํ์ง ์์ต๋๋ค. ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋จผ์ ์ ์ฒด ์๋ฃจ์
์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํค์๋๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ๋ฐ๋ ํ์ ๋ฐ๋ 2๊ฐ ์์๋ ๋ ๊ฐ๋ฅํ ํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ค๊ณ ํ๋ค๊ณ ๋ฐํ์ต๋๋ค. try
ํจ์๋ ์ด๋ฅผ ์ ์งํ๋ฉฐ ๋์ค์ ํ์ฅ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋จํ gofix๋ try
ํจ์๋ฅผ ํค์๋๋ก ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค.
๋ด 2 ์ผํธ ๋ค์!
19๋ 7์ 4์ผ์ Sanjay Menakuru [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@griesemer
[ ... ]
Twitter์์ ์ง์ ํ๋ฏ์ดtry
๋ ์๋ชธ์ฒ๋ผ ํ๋ํฉ๋๋ค.
๋ฐํ๋๋ ๊ฐ์ด ์์์ ์ธ ๊ฒฝ์ฐ ๋ฐํ. ๋ฌด์์ ์์๋ด๊ธฐ ์ํด
์ค์ ๊ฐ์ด ๋ฐํ๋๊ณ ์๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ํ์ธํด์ผ ํ ์๋ ์์ต๋๋ค.
try
์์ฒด์ ๋ํ ํธ์ถ์์ ์๋นํ ๊ฑฐ๋ฆฌ๊ฐ ์์ต๋๋ค.๋ค์ดํค๋ ๋ฆฌํด(non-locality)์ ์ด ์์ฑ์ด ์ผ๋ฐ์ ์ผ๋ก
์ซ์ด์,try
๊ฐ ํญ์ 0์ ๋ฐํํ๋๋ก ํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
์ค๋ฅ๊ฐ ์๋ ์ธ์์ ๊ฐ(์ ํ ๋ฐํ๋๋ ๊ฒฝ์ฐ)?๋ค์ดํค๋ ๋ฐํ์ ๋ฐํ ์ธ์์ ์ด๋ฆ์ด ์ง์ ๋ ๊ฒฝ์ฐ์๋ง ํ์ฉ๋ฉ๋๋ค. ๊ทธ๊ฒ
์๋๊ฐ ๋ค๋ฅธ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ ๊ฐ์ต๋๊น?
๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด defer
๋ฅผ ์ฌ์ฌ์ฉํ๋ค๋ ์ ๋ฐ์ ์ธ ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ try
ํค์๋๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ํจํด์ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ๋ชจ๋ ์ฌ๋์ด ์ด๋ฏธ ์์
ํ์์ ์๊ณ ์๋ ๊ฒ:
res, err := doSomething()
if err != nil {
return err
}
res, _ := doSomething()
try
๊ฐ ํ๋ ค๋ ๊ฒ๊ณผ ์ ์ฌํ ๋์์
๋๋ค.
res, . := doSomething()
@piotrkowalczuk
์ด๊ฒ์ ๋ ์ข์ ๊ตฌ๋ฌธ์ผ ์ ์์ง๋ง Go์ ๊ตฌ๋ฌธ ํ๊ดํ ๋ชจ๋์์ ์ด๊ฒ์ ํฉ๋ฒํํ๊ธฐ ์ํด Go๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@balasanjay (๋ฐ @lootch): ์ฌ๊ธฐ ์ ์๋ ๊ทํ์ ์๊ฒฌ์ ๋ฐ๋ผ ์, https://play.golang.org/p/KenN56iNVg7 ํ๋ก๊ทธ๋จ์ด 1์ ์ธ์ํฉ๋๋ค.
try
๋ ์ค๋ฅ ๊ฒฐ๊ณผ์ ๊ด๋ จ๋ ๊ฒ์ด๋ฏ๋ก ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ทธ๋๋ก ๋ก๋๋ค. ๋ค๋ฅธ ๋ฐํ ๊ฐ์ 0 ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ๋ ๋์ ์ด์ ๋ ๋ถ๋ช
ํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ ๊ฐ์ด 0์ผ๋ก ์ค์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ด๋ฆ์ด ์ง์ ๋ ๋ ๋ ๋ง์ ์์
์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํธ์ถ์๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฌด์ํ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ด๋ ํ๋นํ ์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ์ ์๋ ๋์์ธ ๊ฒฐ์ ์
๋๋ค.
[ํธ์ง: ์ด ์ง๋ฌธ(์ค๋ฅ ๋ฐ์ ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ธ ๊ฒ์ธ์ง ์ฌ๋ถ)์ try
์ ์์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ช
์์ ์ธ return
๊ฐ ํ์ํ์ง ์์ ์ ์๋ ๋์์ ๋์ผํ ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค.]
n += try(wrappedWriter.Write(...))
์๊ฐ์ ์์ ๊ด๋ จํ์ฌ : ์, ์ค๋ฅ์ ๊ฒฝ์ฐ์๋ n
๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํ๋ ์ํฉ์์ try
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค try
๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฐ๊ณผ ๊ฐ์ 0์ผ๋ก ๋ง๋ค์ง ์์ต๋๋ค. try
๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. try
๋ ํจ์์ฒ๋ผ ๊น๋ํ๊ฒ ๋์ํฉ๋๋ค(๊ทธ๋ฌ๋ ํธ์ถ์์๊ฒ ๋ฐํ๋์ง ์๊ณ ํธ์ถ์์ ํธ์ถ์์๊ฒ ๋ฐํ๋ ์ ์๋ ํจ์). try
๊ตฌํ ์์ ์์ ์ฌ์ฉ์ ์ฐธ์กฐํ์ญ์์ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ if
๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ฉฐ ๋ฐํ๋ ๋ฐ์ดํธ ์๋ฅผ n
์ ํตํฉํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์๋ง๋ ๋ด๊ฐ ๋น์ ์ ๊ฑฑ์ ์ ์คํดํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@griesemer : ๋ค๋ฅธ ๋ฐํ ๊ฐ์ 0 ๊ฐ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด try
๊ฐ ํธ์ถ ์ฌ์ดํธ๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฌด์์ ํ ์ ์๋์ง ๋ช
ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. a) ์๋ฌด๊ฒ๋ ํ์ง ์๊ฑฐ๋ b) ๊ฐ์ด 0์ด๊ณ ์๋ํ ์ธ์๊ฐ ์๋ ํจ์์์ ๋ฐํ๋ฉ๋๋ค.
์ง์ ๋ ๋๋ก try
๋ ์ค๋ฅ๊ฐ ์๋ ์ด๋ฆ์ ๋ฐํ ๊ฐ ๊ฐ์ ์ ์งํ๋ฏ๋ก try
๊ฐ ๋ฐํํ๋ ๊ฐ์ ๋ช
ํํ๊ฒ ํ๊ธฐ ์ํด ์ ์ฒด ํจ์๋ฅผ ๊ฒ์ฌํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ค์ดํค๋ ๋ฆฌํด๊ณผ ๋์ผํ ๋ฌธ์ ์ด๋ฉฐ(์ด๋ค ๊ฐ์ด ๋ฆฌํด๋๋์ง ๋ณด๊ธฐ ์ํด ์ ์ฒด ํจ์๋ฅผ ์ค์บํด์ผ ํจ) ์๋ง๋ https://github.com/golang/go/issues/21291์ ์ ์ถํ ์ด์ ์์ ๊ฒ์
๋๋ค. ๋์๊ฒ ์ด๊ฒ์ ์ด๋ฆ์ด ์ง์ ๋ ๋ฐํ ๊ฐ์ด ์๋ ํฐ ํจ์์ try
๊ฐ ๊ธฐ๋ณธ ๋ฐํ๊ณผ ๋์ผํ ๊ธฐ์ค์ผ๋ก ๊ถ์ฅ๋์ง ์์์ผ ํจ์ ์๋ฏธํฉ๋๋ค(https://github.com/golang/go/wiki/CodeReviewComments #named-result-parameters). ๋์ ์ค๋ฅ๊ฐ ์๋ ์ธ์์ 0 ๊ฐ์ ํญ์ ๋ฐํํ๋๋ก try
๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ต๊ทผ์ ๋ฐ๋ ํ์ ๋ํด ๋นํฉ์ค๋ฝ๊ณ ๊ธฐ๋ถ์ด ์ข์ง ์์ต๋๋ค. try
๋ ํด๊ฒฐํ๋ ค๋ ํน์ ๋ฌธ์ (์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ)์ ๋ํ ๋ช
ํํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์๋ฃจ์
์
๋๋ค.
์ ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1๋ ๊ฐ์ ๊ธด ํ ๋ก ๋์ ์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. ๋ ์ฅํฉํ ์ฝ๋๋ฅผ ์ํ๋ฉด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น์ ์ด ํ๋ ์ผ์ ๊ณ์ํ์ญ์์ค. ๋ฐ์์ ํ ๊ตฌ์ฑ์์ด ๋ถ๋ช ํ ์ด์ ์ ๋ณด์ฌ์ค ์ตํธ์ธ ๊ธฐ๋ฅ์ ๋ํ ์์ ํ ์ ๋นํ๋์ง ์์ ์ ํญ์ ๋๋ค!
ํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ go ํ์ด try
๋ฅผ ๊ฐ๋ณ ๋ด์ฅํ์ผ๋ก ๋ง๋ค๋๋ก ๊ถ์ฅํฉ๋๋ค.
try(outf.Seek(linkstart, 0))
try(io.Copy(outf, exef))
๋๋ค
try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))
๋ค์์ผ๋ก ์ฅํฉํ ๊ฒ์ try
์ ๋ํ ์ฐ์์ ์ธ ํธ์ถ์ผ ์ ์์ต๋๋ค.
try
์ ๋ํ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๋๋ถ๋ถ nvictor ์ ๋์ํฉ๋๋ค. ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ด ํธ๋ค๋ฌ๋ฅผ ์ํ ์๋ฆฌ๊ฐ ์์ด์ผ ํ๊ณ ๊ฐ๋ณ์ ์ธ ์ ์์ด ์ค์ค๋ก ๊ฐ๋
์ฑ ๊ฒฝ๊ณ๋ฅผ ๋ฐ์ด๋ถ์ผ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
@nvictor Go๋ ๋น์ง๊ต์ ๊ธฐ๋ฅ์ ์ข์ํ์ง ์๋ ์ธ์ด์
๋๋ค. ์ฆ, ๋ฏธ๋์ try
๊ฐ ์๋ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ์๋ฃจ์
์ ์์๋ธ๋ค๋ฉด ์ ํํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ณต์กํด์ง ๊ฒ์
๋๋ค(ํ์ฌ ์๋ฃจ์
์ "์ถฉ๋ถํ ์ข์ต๋๋ค").
try
๋ณด๋ค ๋ ๋์ ์๋ฃจ์
์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ง์กฑํ๋ ๊ฒ๋ณด๋ค ์ฒ์ฒํ ๊ทธ ์๋ฃจ์
์ ์ฐพ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ถ๊ฐ๋๋ฉด ํ๋ฅผ ๋ด์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋์ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค. ๋จ์ง ์ฐ๋ฆฌ๊ฐ ๋ ๋์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด ๋ณด๊ธฐ์๋ ๋ธ๋ก ์ฝ๋๋ฅผ ์๋ํ๊ณ ์ถ์ต๋๋ค. ์ด์ try
ํธ๋ค err func์ฒ๋ผ
์ด ํ ๋ก (๋ฐ Reddit์ ํ ๋ก )์ ์ฝ์ ๋ ํญ์ ๋ชจ๋ ์ฌ๋์ด ๊ฐ์ ์๊ฐ์ ํ๊ณ ์๋ค๋ ๋๋์ด ๋ค์ง ์์์ต๋๋ค.
๋ฐ๋ผ์ try
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ( https://faiface.github.io/post/how-to-use-try/)์ ์์ฑํ์ต๋๋ค.
์ ๋ ์ด ์ ์์ ์ฌ๋ฌ ์ธก๋ฉด์ ๋ณด์ฌ์ฃผ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๊ทธ๋์ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด ์ ์์ด ํ ์ ์๋ ์ผ์ ๋ณด๊ณ ๋ ๋ง์ ์ ๋ณด์ ์ ๊ฐํ(๋ถ์ ์ ์ผ์ง๋ผ๋) ์๊ฒฌ์ ํ์ฑํ ์ ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ๋์ณค๋ค๋ฉด ์๋ ค์ฃผ์ธ์!
@faiface ๋๋ ๋น์ ์ด ๋์ฒด ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
if err != nil {
return resps, err
}
try(err)
.
๊ทธ ์ธ์ - ํ๋ฅญํ ๊ธฐ์ฌ!
@DmitriyMV ์ฐธ! ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ๊ทธ๋๋ก ์ ์งํ์ฌ ๊ณ ์ ์ ์ธ if err != nil
์ ์๊ฐ ์ ์ด๋ ํ๋๋ ์์ง๋ง ์์ฃผ ์ข์ ๊ฒ์ ์๋๋๋ค.
๋ ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
- ๋ช ๋ช ๋ ๋ฐํ์ ๋งค์ฐ ํผ๋์ค๋ฝ๊ณ ์๋กญ๊ณ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฅ๋ คํฉ๋๋ค.
- ์ด๊ฒ์ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ด ๊ฒฝํ์ ๊ฐ ํธ์ถ ์ฌ์ดํธ ์งํ์ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์๋ ์ฝ๋๋ฅผ ๊ฐ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๋ช ๋ ๋ฐํ์ ๋ด๊ฐ ์๋ ๊ฑฐ์ ๋ชจ๋ Go ๊ฐ๋ฐ์์๊ฒ ํผ๋์ ์ผ๊ธฐํ์ต๋๋ค.
์ข ๋ ์ฌ์ํ๊ณ ๋ฌธ์ฒด์ ์ธ ๋ฌธ์ ๋ ์ด์
try(actualThing())
์ ๋ช ์ค์ ์ฝ๋๊ฐ ๋ํ๋๋์ง ์ ๊ฐ์ค๋ฝ์ต๋๋ค.try()
๋ก ๋ํ๋ ์ฝ๋๋ฒ ์ด์ค์์ ๋๋ถ๋ถ์ ๋ผ์ธ์ ๋ณด๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ๋ถํํ๊ฒ ๋๊ปด์ง๋ค.์ด๋ฌํ ๋ฌธ์ ๋ ์กฐ์ ์ผ๋ก ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
a, b, err := myFunc() check(err, "calling myFunc on %v and %v", a, b)
check()
๋try()
์ ๋งค์ฐ ์ ์ฌํ๊ฒ ๋์ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํจ์ ๋ฐํ ๊ฐ์ ์ ๋ฌํ๋ ๋์์ ์ญ์ ํ๊ณ ๋์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ ํ โโ๋ฐํ์ ์ ๋ฐํ ๊ฒ์ ๋๋ค.์ด๋ ๊ฒ ํ๋ฉด
try()
์ ๋ง์ ์ด์ ์ด ์ ์ง๋ฉ๋๋ค.
- ๊ทธ๊ฒ์ ๋ด์ฅ
- ๊ทธ๊ฒ์ ์ฐ๊ธฐํ๊ธฐ ์ํด ๊ธฐ์กด ์ ์ด ํ๋ฆ WRT๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ ์ถ๊ฐํ๋ ๊ธฐ์กด ๊ดํ๊ณผ ์ผ์นํฉ๋๋ค.
errors.Wrap(err, "context message")
์ ๊ฐ์ ์ค๋ฅ ๋ํ์ ์ํ ํ์ฌ ์ ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ์นํฉ๋๋ค.- ๊ฒฐ๊ณผ์ ์ผ๋ก ๊นจ๋ํ ํธ์ถ ์ฌ์ดํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
a, b, err := myFunc()
๋ผ์ธ์ ์์ฉ๊ตฌ๊ฐ ์์ต๋๋ค.defer fmt.HandleError(&err, "msg")
๋ก ์ค๋ฅ๋ฅผ ์ค๋ช ํ๋ ๊ฒ์ ์ฌ์ ํ โโ๊ฐ๋ฅํ์ง๋ง ๊ถ์ฅํ ํ์๋ ์์ต๋๋ค.check
์ ์๋ช ์ ๋ํํ๋ ํจ์์์ ์์์ ์์ ์ธ์๋ฅผ ๋ฐํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋ ๊ฐ๋จํฉ๋๋ค.
์ด๊ฑฐ ์ข์๋ฐ ๋ฐ๋ํ์ด ์ด๊ฑฐ ๊ผญ ๊ฐ์ ธ๊ฐ์ผ ํ ๊ฒ ๊ฐ์์. ์ด๊ฒ์ ์๋๋ณด๋ค ๋ ๋ช ํํ๊ฒ !!!
@buchanae ์ ๋ try
๊ฐ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ง๋๋ค๊ณ ์ฃผ์ฅํ๊ธฐ ๋๋ฌธ์ ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํ ๋จ๊ณ์์๋ ๊ทธ๋ฅ ๋ฒ๋ฆฌ๊ฒ ์ต๋๋ค. ์กฐ๊ธ ๋ ์๊ฐํด๋ณด๊ฒ ์ง๋ง ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ์์๋ณด๊ธฐ ์ํด ์ฌ๊ธฐ์ ๊ธ์ ์ฌ๋ฆฝ๋๋ค. ์ด์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น? ๋๋ ์ด๊ฒ์ #32811์๋ ์ฌ๋ ธ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ฐ์ฑ์ ๋์ด๊ธฐ ์ํด ์ผ์ข ์ ์ผ๋ฐ C ๋งคํฌ๋ก๋ฅผ ์ํํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ด์ ๊ฐ์ด:
define returnIf(err error, desc string, args ...interface{}) {
if (err != nil) {
return fmt.Errorf("%s: %s: %+v", desc, err, args)
}
}
func CopyFile(src, dst string) error {
r, err := os.Open(src)
:returnIf(err, "Error opening src", src)
defer r.Close()
w, err := os.Create(dst)
:returnIf(err, "Error Creating dst", dst)
defer w.Close()
...
}
๋ณธ์ง์ ์ผ๋ก returnIf๋ ์์์ ์ ์ํ ๊ฒ์ผ๋ก ๋์ฒด/์ธ๋ผ์ธ๋ฉ๋๋ค. ์ ์ฐ์ฑ์ ๊ทธ๊ฒ์ด ๋ฌด์์ ํ๋๋์ ๋ฌ๋ ค ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํฐ๊ฐ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ์๋ํฐ์์ ์ด๋ฅผ ๋์ฒดํ์ง ์๋ ํ ์ด๊ฒ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ฝ๊ฐ ์ด์ํ ์ ์์ต๋๋ค. ๋ํ ์ ์๋ฅผ ๋ช ํํ๊ฒ ์ฝ์ ์ ์์ผ๋ฏ๋ก ๋ ๋ง์ ์ ์ ๋๋ค. ๋ํ ์ด๋ฅผ ํตํด ์ ์ฌ์ ์ผ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ฐํ๋ ์ ์๋ ํ ์ค์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ํ ์์น(์ปจํ ์คํธ)์ ๋ฐ๋ผ ๋ค๋ฅธ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
ํธ์ง: ๋ํ ๋งคํฌ๋ก ์์ ์ฝ๋ก ์ ์ถ๊ฐํ์ฌ ํจ์ ํธ์ถ์ด ์๋ ๋งคํฌ๋ก์์ ๋ช ํํ ํ๊ธฐ ์ํด ์ํํ ์ ์์์ ์์ฌํฉ๋๋ค.
@nvictor
๋ ๋์๊ฐ go ํ์ด
try
๋ฅผ ๊ฐ๋ณ ๋ด์ฅํ์ผ๋ก ๋ง๋ค๋๋ก ๊ถ์ฅํฉ๋๋ค.
try(foo(), bar())
foo
์ bar
๊ฐ ๊ฐ์ ๊ฒ์ ๋ฐํํ์ง ์์ผ๋ฉด try(foo(), bar())๋ ๋ฌด์์ ๋ฐํํ ๊น์?
ํ ๋จ๊ณ์์๋ ๊ทธ๋ฅ ๋ฒ๋ฆฌ๊ฒ ์ต๋๋ค. ์กฐ๊ธ ๋ ์๊ฐํด๋ณด๊ฒ ์ง๋ง ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ์์๋ณด๊ธฐ ์ํด ์ฌ๊ธฐ์ ๊ธ์ ์ฌ๋ฆฝ๋๋ค. ์ด์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น? ๋๋ ์ด๊ฒ์ #32811์๋ ์ฌ๋ ธ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ฐ์ฑ์ ๋์ด๊ธฐ ์ํด ์ผ์ข ์ ์ผ๋ฐ C ๋งคํฌ๋ก๋ฅผ ์ํํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
@Chillance , IMHO, Rust(๋ฐ ๋ค๋ฅธ ๋ง์ ์ธ์ด)์ ๊ฐ์ ์์์ ์ธ โโ๋งคํฌ๋ก ์์คํ
์ ์ฌ๋๋ค์๊ฒ try
๋๋ ์ ๋ค๋ฆญ๊ณผ ๊ฐ์ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ๋ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํ๊ณ ๊ฒฝํ์ ์ป์ ํ์ ์ต๊ณ ์ ์์ด๋์ด๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธ์ด ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์
๋๋ค. ํ์ง๋ง ๊ทธ๋ฐ ๊ฒ์ด ๋ฐ๋์ ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@jonbodner ํ์ฌ Go์ ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ์๋ ์ ์์ด ์์ต๋๋ค. ์์ง ์ ์๋ ๊ตฌ๋ฌธ์ด๋ ์ด๋ค ๊ฒ๋ ์์ง๋ง ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ๋ ์์ด๋์ด๋ _๋ฐ๋_ ๋ง์ด ์์ต๋๋ค. #32620
@Allenyn , ๋ฐฉ๊ธ ์ธ์ฉ ํ @buchanae ์ ์ด์ ์ ์์ ๋ํด:
a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)
ํ ๋ก ์ ๋ํด ๋ด๊ฐ ๋ณธ ๋ฐ์ ๋ฐ๋ฅด๋ฉด fmt
์ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ด์ฅ ํจ์์ ํฌํจ๋๋ ๊ฒ์ ์ฌ๊ธฐ์์ ์์ ๋ฒํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ ๊ฒ์
๋๋ค. (์๋ฅผ ๋ค์ด @josharian ์ ์๋ต ์ฐธ์กฐ).
์ฆ, ํธ๋ค๋ฌ ํจ์๋ฅผ ํ์ฉํ๋ฉด fmt
์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ด์ฅ์ผ๋ก ์ง์ ๋์ด์ค๋ ๊ฒ์ ํผํ ์ ์๊ธฐ ๋๋ฌธ์ ํฌํจํ์ฌ ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋๋ ํ ๋ก ์ ์ฒซ๋ ์ ๋์ @eihigh ๊ฐ ์ ์ํ ๊ฒ์ผ๋ก, ์ด๋ @buchanae ์ ์ ์๊ณผ ์ ์ฌํ๋ฉฐ try
๋ด์ฅ์ ๋์ ๋ค์ ์๋ช
์ ๊ฐ๋๋ก ์กฐ์ ํ๋ ๊ฒ์ ์ ์ํ์ต๋๋ค.
func try(error, optional func(error) error)
์ด ๋์ try
์ ์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์์ผ๋ฏ๋ก ํด๋น ์๋ช
์ ๋ค์์ ์๋ฏธํฉ๋๋ค.
๋๋ bikeshedding ์ด๋ฆ์ ์คํํ๊ณ ์ถ์ง ์์ง๋ง try
check
์ ๊ฐ์ ๋์ฒด ์ด๋ฆ์ผ๋ก ๋ ์ ์ฝ์ ์ ์์ต๋๋ค. ์ ํ์ in-place ์ฃผ์์ ํธ๋ฆฌํ๊ฒ ๋ง๋ค ์ ์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ฐ๋ฏธ๋ฅผ ์์ํ ์ ์๋ ๋ฐ๋ฉด ์ํ๋ ๊ฒฝ์ฐ defer
๋ ๊ท ์ผํ ์ฃผ์์ ๋ํ ์ต์
์ผ๋ก ๋จ์ ์ ์์ต๋๋ค.
๋์ค์ #32811( catch
๋ด์ฅ) ๋ฐ #32611( $# on err, <statement>
ํ์ฉ์ ์ํ on
ํค์๋)์์ ๊ด๋ จ ์ ์์ด ์์ฑ๋์์ต๋๋ค. ๋ ๋
ผ์ํ๊ฑฐ๋, ์ถ์ฒ ๋๋ ์ถ์ฒ์ ์ถ๊ฐํ๊ฑฐ๋, ํด๋น ์ ์์ ๊ฐ๋ฅํ ์กฐ์ ์ ์ ์ํ๊ธฐ์ ์ข์ ์ฅ์์ผ ์ ์์ต๋๋ค.
@jonbodner ํ์ฌ Go์ ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ์๋ ์ ์์ด ์์ต๋๋ค. ์์ง ์ ์๋ ๊ตฌ๋ฌธ์ด๋ ์ด๋ค ๊ฒ๋ ์์ง๋ง ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ๋ ์์ด๋์ด๋ _๋ฐ๋_ ๋ง์ด ์์ต๋๋ค. #32620
์ ์์ด ์๋ ๊ฒ์ ์ข์๋ฐ ํต์ฌ ๋ฐ๋ํ์ด ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ ์๊ฐ์ ์๋ ๊ฒ ๊ฐ์์. ๊ทธ๋ฌ๋ ํ์ฌ ์ธ์ด ํต์ฌ์ ๋ํ ์์ ์ด ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ชจ๋ ๋ ผ์์ ๋๋ด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ์๋ชป ์๊ณ ์์ผ๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค. ์ ๋ช ํ ๊ผญ๋๊ฐ์๋ฅผ ์ธ์ฉํ์๋ฉด "ํด์ผ ํ๋ค. ์๋๋ฉด ํ์ง ๋ง๋ผ. ์๋๋ ์๋ค."
@jonbodner ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ๋ค๊ณ ํด์ ๋
ผ์์ด ๋๋ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ต๋๋ค. ์ ๋ฐ๋. ์ผ๋ฐ์ ์ธ ๋นํ์ try
๊ฐ ๋ฐํ์ "์จ๊ธด๋ค"๋ ๊ฒ์
๋๋ค. ๋งคํฌ๋ก์์๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ด์ ์์ ๋งคํฌ๋ก๋ ์๊ฒฉํ ๋๋น ์ง ๊ฒ์
๋๋ค. Go๊ฐ ์ฌ์ฉ์ ์ ์ ์์ ๋งคํฌ๋ก๋ฅผ ํ์ฉํ๋๋ผ๋ try
๊ฐ Universe ๋ธ๋ก์ ๋ฏธ๋ฆฌ ์ ์ธ๋ ๋ด์ฅ ๋งคํฌ๋ก์ฌ์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํด ์ฌ์ ํ ๋
ผ์ํด์ผ ํฉ๋๋ค. try
์ ๋ฐ๋ํ๋ ์ฌ๋๋ค์ ์์ ๋งคํฌ๋ก์ ํจ์ฌ ๋ ๋ฐ๋ํ๋ ๊ฒ์ด ๋
ผ๋ฆฌ์ ์ผ ๊ฒ์
๋๋ค ;-)
@ngrilly ๋งคํฌ๋ก๊ฐ ๋์ ๋๊ณ ๋ณด๊ธฐ ์ฝ๊ฒ ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. Rust๊ฐ ํ๋ ๋ฐฉ์์ ๋งคํฌ๋ก๊ฐ ํญ์ !
(์ฆ, try!(...)
๋ฐ println!(...)
)๋ก ์งํ๋๋ค๋ ๊ฒ์
๋๋ค.
์์์ ์ธ ๋งคํฌ๋ก๊ฐ ์ฑํ๋๊ณ ๋ณด๊ธฐ ์ฝ๊ณ ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์ด์ง ์๋๋ค๋ฉด ํจ์ฌ ๋ ์ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋ณ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋ณด๋ค๋ ๋ณด๋ค ๋ฒ์ฉ์ ์ธ ์๋ฃจ์ ์ ์ ํํด์ผ ํฉ๋๋ค.
@thepudds func(error) error
์ ํ์ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์๋ค๋ ์ ์ ๋์ํฉ๋๋ค(์ด ๊ฐ๋ฅ์ฑ์ ์ ์์์์ ๋
ผ์๋๋ฉฐ ํด๊ฒฐํด์ผ ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์). ๊ทธ๋ฌ๋ try
์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์์ต๋๋ค. Go ํ์์ ์ ์ํ try
๋ ์ข ๋ ์ผ๋ฐ์ ์ธ ๋๊ตฌ์
๋๋ค.
@deanveloper ์, Rust์ ๋งคํฌ๋ก ๋์ ์๋ !
๋ ์๋ฆฌํฉ๋๋ค. Go์์ ๋๋ฌธ์๋ก ์์ํ๋ ๋ด๋ณด๋ธ ์๋ณ์๋ฅผ ์๊ธฐ์ํต๋๋ค :-)
์ปดํ์ผ ์๋๋ฅผ ์ ์งํ๊ณ ๋๊ตฌ์ ๊ด๋ จ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ์๋ง Go์์ ์์์ ์ธ โโ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์ํฉ๋๋ค(๋ฆฌํฉํ ๋ง ๋๊ตฌ๋ ์ฝ๋์ ์๋ฏธ๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋งคํฌ๋ก๋ฅผ ํ์ฅํด์ผ ํ์ง๋ง ํ์ฅ๋์ง ์์ ๋งคํฌ๋ก๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํจ). . ์ด๋ ต๋ค ๊ทธ ๋์ try
์ ์ด๋ฆ์ด try!
๋ก ๋ฐ๋ ์ ์์ต๋๊น? ;-)
๊ฐ๋จํ ์์ด๋์ด: if/for ๊ตฌ๋ฌธ์ ๋ณธ๋ฌธ์ ๋จ์ผ ๋ฌธ์ด ํฌํจ๋์ด ์์ผ๋ฉด ์ด ๋ฌธ์ด if
๋๋ for
์ ๊ฐ์ ์ค์ ์๋ ๊ฒฝ์ฐ ์ค๊ดํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์์:
fd, err := os.Open("foo")
if err != nil return err
ํ์ฌ error
์ ํ์ ์ผ๋ฐ ์ธํฐํ์ด์ค ์ ํ์
๋๋ค. ์ปดํ์ผ๋ฌ๋ ๊ทธ๊ฒ์ ํน๋ณํ ๊ฒ์ผ๋ก ์ทจ๊ธํ์ง ์์ต๋๋ค. try
๋ ๊ทธ๊ฒ์ ๋ณ๊ฒฝํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ error
๋ฅผ ํน๋ณ ์ทจ๊ธํ ์ ์๋ค๋ฉด /bin/sh
์์ ์๊ฐ์ ๋ฐ์ ||
์ ์ ํธํฉ๋๋ค.
fd, err := os.Open("foo") || return err
์ด๋ฌํ ์ฝ๋์ ์๋ฏธ๋ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋งค์ฐ ๋ถ๋ช ํ๋ฉฐ ์จ๊ฒจ์ง ์ ์ด ํ๋ฆ์ด ์์ผ๋ฉฐ ํ์ฌ ์ด ์ฝ๋๋ ๋ถ๋ฒ์ด๋ฏ๋ก ์์ ์ฝ๋๊ฐ ์์๋์ง ์์ต๋๋ค.
๋๋ ์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๊ฐ ๊ณตํฌ์ ์์ธ ๋ฌ๋๋ ๊ฒ์ ์์ํ ์ ์์ง๋ง.
@bakul if err != nil return err
์์ err != nil
ํํ์์ด ๋๋๋ ์์น์ return err
๋ฌธ์ด ์์๋๋ ์์น๋ฅผ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ๊ทํ์ ์์ด๋์ด๋ try
๋ก ์ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํฐ ์ธ์ด ๋ฌธ๋ฒ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์
๋๋ค.
๋ ๋ฒ์งธ ์์ด๋์ด๋ Zig ์์ catch |err| return err
์ฒ๋ผ ๋ณด์
๋๋ค. ๊ฐ์ธ์ ์ผ๋ก, ๋๋ "๊ณตํฌ์ ๋ฐ๋"ํ์ง ์๊ณ ๋๋ ์ ๊ทธ๋ ์ง ์๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ Zig์๋ catch |err| return err
์ ๋ฐ๋ก ๊ฐ๊ธฐ์ธ try
ํค์๋๋ ์์ผ๋ฉฐ Go ํ์ด ์ฌ๊ธฐ์์ ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์ผ๋ก ์ ์ํ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด try
์ด๋ฉด ์ถฉ๋ถํ๊ณ catch
ํค์๋๋ ํ์ํ์ง ์์ต๋๊น? ;-)
@ngrilly , ํ์ฌ <expr> <statement>
๋ ์ ํจํ์ง ์์ผ๋ฏ๋ก ์ด ๋ณ๊ฒฝ์ด ๋ฌธ๋ฒ์ ๋ ๋ชจํธํ๊ฒ ๋ง๋ค์ง๋ ์์ง๋ง ์กฐ๊ธ ๋ ์ทจ์ฝํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ try ์ ์๊ณผ ์ ํํ ๋์ผํ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง a) ์ฌ๊ธฐ์ ๋ฐํ์ด ๋ช
์์ ์
๋๋ค. b) try์์์ ๊ฐ์ด ์ค์ฒฉ์ด ๋ถ๊ฐ๋ฅํ๊ณ c) ์ด๊ฒ์ ์ ์ฌ์ฉ์(zig ์ฌ์ฉ์๋ณด๋ค ํจ์ฌ ๋ง์ ์)์๊ฒ ์น์ํ ๊ตฌ๋ฌธ์
๋๋ค. ์ฌ๊ธฐ์ catch
์ด ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋์์ผ๋ก ์ ๊ธฐํ์ง๋ง ์์งํ ๋งํด์ ๋๋ ํต์ฌ go ์ธ์ด ๋์์ด๋๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๋ฌด์์ด๋ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค.
tryhard
์ ์ฝ๊ฐ ๊ฐ์ ๋ ๋ฒ์ ์ ์
๋ก๋ํ์ต๋๋ค. ์ด์ ์
๋ ฅ ํ์ผ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ง๊ธ ๋ณด๊ณ ํ๋ Go ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ ๋ถ๋ถ์ ๋ํด ์คํํฉ๋๋ค.
$ tryhard $HOME/go/src
...
--- stats ---
55620 (100.0% of 55620) function declarations
14936 ( 26.9% of 55620) functions returning an error
116539 (100.0% of 116539) statements
27327 ( 23.4% of 116539) if statements
7636 ( 27.9% of 27327) if <err> != nil statements
119 ( 1.6% of 7636) <err> name is different from "err" (use -l flag to list file positions)
6037 ( 79.1% of 7636) return ..., <err> blocks in if <err> != nil statements
1599 ( 20.9% of 7636) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
17 ( 0.2% of 7636) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
5907 ( 77.4% of 7636) try candidates (use -l flag to list file positions)
๋ ํด์ผ ํ ์ผ์ด ์์ง๋ง ์ด๊ฒ์ ๋ ๋ช
ํํ ๊ทธ๋ฆผ์ ์ ๊ณตํฉ๋๋ค. ํนํ, ๋ชจ๋ if
๋ฌธ์ 28%๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์ด๋ ์๋นํ ์์ ๋ฐ๋ณต ์ฝ๋๊ฐ ์์์ ํ์ธํฉ๋๋ค. ์ด๋ฌํ ์ค๋ฅ ๊ฒ์ฌ ์ค 77%๋ try
์ ์ ํฉํฉ๋๋ค.
$ tryhard .
--- ํต๊ณ ---
2930(2930์ 100.0%) ํจ์ ์ ์ธ
1408(2930์ 48.1%) ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํจ
10497(10497์ 100.0%) ๋ฌธ
2265(10497์ 21.6%) if ๋ฌธ
1383(2265์ 61.1%)
0 ( 1383์ 0.0%)
ํ์ผ ์์น ๋์ด)
645(1383์ 46.6%) ๋ฐํ ...,
์ง์
738(1383์ 53.4%) ๋ ๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ
์ง์ ; try ์ฌ์ฉ ๋ฐฉ์ง(-l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์น ๋์ด)
1(1383์ 0.1%) ๋น์ด ์์ง ์์ else ๋ธ๋ก์ if
์ง์ ; try ์ฌ์ฉ ๋ฐฉ์ง(-l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์น ๋์ด)
638(1383์ 46.1%) ํ๋ณด๋ฅผ ์๋ํฉ๋๋ค(ํ์ผ์ ๋์ดํ๋ ค๋ฉด -l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ง์)
$ ์ด๋ ๋ชจ๋ ๊ณต๊ธ์
์ฒด
$ ํธ๋ผ์ดํ๋ ๋ฒค๋
--- ํต๊ณ ---
37757(37757์ 100.0%) ํจ์ ์ ์ธ
12557(37757์ 33.3%) ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํจ
88919(88919์ 100.0%) ๋ฌธ
20143 (88919์ 22.7%) if ๋ฌธ
6555(20143์ 32.5%)
109(6555์ 1.7%)
ํ์ผ ์์น ๋์ด)
5545(6555์ 84.6%) ๋ฐํ ...,
์ง์
1010(6555์ 15.4%) ๋ ๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ
์ง์ ; try ์ฌ์ฉ ๋ฐฉ์ง(-l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์น ๋์ด)
12(6555์ 0.2%) ๋น์ด ์์ง ์์ else ๋ธ๋ก์ if
์ง์ ; try ์ฌ์ฉ ๋ฐฉ์ง(-l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์น ๋์ด)
5427(6555์ 82.8%) ํ๋ณด๋ฅผ ์๋ํฉ๋๋ค(ํ์ผ์ ๋์ดํ๋ ค๋ฉด -l ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ง์)
๊ทธ๋์ ๋งคํฌ๋ก ์์ ์ ์ฝ๋ก ์ ์ถ๊ฐํ์ฌ ํจ์ ํธ์ถ์ฒ๋ผ ๋ณด์ด์ง ์๊ณ ํ์ด๋์ค๋๋ก ํ์ต๋๋ค. ๋ฌผ๋ก ์ฝ๋ก ์ผ ํ์๋ ์์ต๋๋ค. ๋จ์ง ์์ผ ๋ฟ์ ๋๋ค. ๋ํ ๋งคํฌ๋ก๋ ์๋ฌด ๊ฒ๋ ์จ๊ธฐ์ง ์์ต๋๋ค. ๋งคํฌ๋ก๊ฐ ํ๋ ์ผ์ ๋ณด๋ฉด ๋ฉ๋๋ค. ๋ง์น ํจ์์ธ ๊ฒ์ฒ๋ผ ์ธ๋ผ์ธ๋ ๊ฒ์ ๋๋ค. ๊ฒ์์ ์ํํ๊ณ ๋งคํฌ๋ก ์ฌ์ฉ์ด ์๋ฃ๋ ํจ์๋ก ๋งคํฌ๋ก์ ์ฝ๋ ์กฐ๊ฐ์ผ๋ก ๊ต์ฒดํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋น์ฐํ ์ฌ๋๋ค์ด ๋งคํฌ๋ก ๋งคํฌ๋ก๋ฅผ ๋ง๋ค๊ณ ๋ณต์กํด์ง๊ธฐ ์์ํ๋ฉด ์ฝ๋๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ ์์ ์ ํํด์ผ ํฉ๋๋ค. :)
@mirtchovski
$ tryhard .
--- stats ---
2930 (100.0% of 2930) function declarations
1408 ( 48.1% of 2930) functions returning an error
10497 (100.0% of 10497) statements
2265 ( 21.6% of 10497) if statements
1383 ( 61.1% of 2265) if <err> != nil statements
0 ( 0.0% of 1383) <err> name is different from "err" (use -l flag to list file positions)
645 ( 46.6% of 1383) return ..., <err> blocks in if <err> != nil statements
738 ( 53.4% of 1383) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
1 ( 0.1% of 1383) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
638 ( 46.1% of 1383) try candidates (use -l flag to list file
positions)
$ go mod vendor
$ tryhard vendor
--- stats ---
37757 (100.0% of 37757) function declarations
12557 ( 33.3% of 37757) functions returning an error
88919 (100.0% of 88919) statements
20143 ( 22.7% of 88919) if statements
6555 ( 32.5% of 20143) if <err> != nil statements
109 ( 1.7% of 6555) <err> name is different from "err" (use -l flag to list file positions)
5545 ( 84.6% of 6555) return ..., <err> blocks in if <err> != nil statements
1010 ( 15.4% of 6555) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
12 ( 0.2% of 6555) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
5427 ( 82.8% of 6555) try candidates (use -l flag to list file
positions)
$
@av86743 ,
์ฃ์กํฉ๋๋ค. "์ด๋ฉ์ผ ํ์ ์ Markdown์ ์ง์ํ์ง ์์ต๋๋ค"๋ฅผ ๊ณ ๋ คํ์ง ์์์ต๋๋ค.
์ด๋ค ์ฌ๋๋ค์ tryhard
๊ฒฐ๊ณผ์์ ๊ณต๊ธ์
์ฒด ์ฝ๋๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด ๊ณต์ ํ์ง ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ์๋ฅผ ๋ค์ด std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต๊ธ์
์ฒด ์ฝ๋์๋ ๋ง์ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ํฌํจํ๊ณ ์ ์ฒด ๊ทธ๋ฆผ์ ์๊ณกํ ์ ์๋ ์์ฑ๋ syscall
ํจํค์ง๊ฐ ํฌํจ๋ฉ๋๋ค. tryhard
์ ์ต์ ๋ฒ์ ์ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก "vendor"
๋ฅผ ํฌํจํ๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์ธํฉ๋๋ค(์ด๋ ๋ํ ์๋ก์ด -ignore
ํ๋๊ทธ๋ก ์ ์ดํ ์ ์์). ํ์์ std ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉ:
tryhard $HOME/go/src
/Users/gri/go/src/cmd/go/testdata/src/badpkg/x.go:1:1: expected 'package', found pkg
/Users/gri/go/src/cmd/go/testdata/src/notest/hello.go:6:1: expected declaration, found Hello
/Users/gri/go/src/cmd/go/testdata/src/syntaxerror/x_test.go:3:11: expected identifier
--- stats ---
45424 (100.0% of 45424) func declarations
8346 ( 18.4% of 45424) func declarations returning an error
71401 (100.0% of 71401) statements
16666 ( 23.3% of 71401) if statements
4812 ( 28.9% of 16666) if <err> != nil statements
86 ( 1.8% of 4812) <err> name is different from "err" (-l flag lists details)
3463 ( 72.0% of 4812) return ..., <err> blocks in if <err> != nil statements
1349 ( 28.0% of 4812) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
17 ( 0.4% of 4812) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
3345 ( 69.5% of 4812) try candidates (-l flag lists details)
์ด์ ๋ชจ๋ if
๋ฌธ์ 29%(28.9%)๊ฐ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ(์ด์ ๋ณด๋ค ์ฝ๊ฐ ๋ง์), ๊ทธ ์ค ์ฝ 70%๊ฐ try
(์ฝ๊ฐ ์ด์ ๋ณด๋ค ์ ์).
https://golang.org/cl/185177 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: src: apply tryhard -err="" -ignore="vendor" -r $GOROOT/src
@griesemer "๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ"๋ ๊ณ์ฐํ์ง๋ง "๋จ์ผ ๋ช ๋ น๋ฌธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ"๋ ๊ณ์ฐํ์ง ์์์ต๋๋ค.
๋๋ถ๋ถ์ "๋ณต์กํ" ํธ๋ค๋ฌ๊ฐ ๋จ์ผ ๋ช
๋ น๋ฌธ์ธ ๊ฒฝ์ฐ on err
#32611์ try()
-- 2์ค ๋ 3์ค x 70%๋งํผ ์์ฉ๊ตฌ ์ ์ฝ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ on err
๋ ๋๋ถ๋ถ์ ์ค๋ฅ์ ๋ํด ์ผ๊ด๋ ํจํด์ ์ด์ ์ ์ถ๊ฐํฉ๋๋ค.
@nvictor
try
๋ ํด๊ฒฐํ๋ ค๋ ํน์ ๋ฌธ์ ์ ๋ํ ๋ช ํํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์๋ฃจ์ ์ ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ.
์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ _๋ฌธ์ _๊ฐ ์๋๋ผ Go์ ๊ฐ์ ์ ๋๋ค.
์ ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1๋ ๊ฐ์ ๊ธด ํ ๋ก ๋์ ์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. ๋ ์ฅํฉํ ์ฝ๋๋ฅผ ์ํ๋ฉด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋น์ ์ด ํ๋ ์ผ์ ๊ณ์ํ์ญ์์ค. ๋ฐ์์ ํ ๊ตฌ์ฑ์์ด ๋ถ๋ช ํ ์ด์ ์ ๋ณด์ฌ์ค ์ตํธ์ธ ๊ธฐ๋ฅ์ ๋ํ ์์ ํ ์ ๋นํ๋์ง ์์ ์ ํญ์ ๋๋ค!
์์ฑ ์์ ์ ๊ทํ์ _opt -in_์ ๋ฏธ๋์ ๋น์ ์ ํฌํจํ ๋ชจ๋ ๋ ์์ _ํ์_์ ๋๋ค.
๋ถ๋ช ํ ์ฅ์
ํ๋ฆฟํ ์ ์ด ํ๋ฆ์ '์ฅ์ '์ด๋ผ๊ณ ํ ์ ์๋ค๋ฉด ๊ทธ๋ ์ต๋๋ค.
try
, Java ๋ฐ C++ ๊ตญ์ธ ๊ฑฐ์ฃผ์์ ์ต๊ด์ ์ํด ๋ชจ๋ Gophers๊ฐ ์ดํดํด์ผ ํ๋ ๋ง๋ฒ์ ์๊ฐํฉ๋๋ค. ๊ทธ ๋์ ์์์ ๋ช ์ค์ ๋จ๊ฒจ์ ๋ช ๊ณณ์์ ์์ฑํฉ๋๋ค( tryhard
์คํ์์ ๋ณผ ์ ์๋ฏ์ด).
๋๋ ๋ด ๋ฐฉ์์ด ๋ ๋จ์ํ oneErr ๋งคํฌ๋ก ๊ฐ ๋ ๋ง์ ์ค์ ์ฐ๋ ๋ฐ ์ฌ์ ๊ฐ ์๊ณ ๋๋ค์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ฅํ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค.
x, err = fa()
onErr break
r, err := fb(x)
onErr return 0, nil, err
if r, err := fc(x); onErr && triesleft > 0 {
triesleft--
continue retry
}
_(์ ๋ ' if err!= nil
ํผ์ ๋๊ธฐ' ์บ ํ์ ์์ผ๋ฉฐ ๋ ๋ง์ ์ง์ง๊ฑฐ๋ฆผ์ ๋ง์กฑ์ํฌ ์ ์๋ ๋ ๊ฐ๋จํ ์๋ฃจ์
์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์์ ๋ฐ๋ ์ ์์ด ๊ฒ์๋์์ต๋๋ค.)_
ํธ์งํ๋ค:
ํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ go ํ์ด
try
๋ฅผ ๊ฐ๋ณ ๋ด์ฅํ์ผ๋ก ๋ง๋ค๋๋ก ๊ถ์ฅํฉ๋๋ค.
try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))
~์ฐ๊ธฐ๊ฐ ์งง๊ณ ์ฝ๊ธฐ๊ฐ ๊ธธ๋ฉฐ ๋ฏธ๋๋ฌ์ง๊ฑฐ๋ ์คํดํ๊ธฐ ์ฝ๊ณ ์ ์ง ๋ณด์ ๋จ๊ณ์์ ๋ฒ๊ฒจ์ง๊ณ ์ํํฉ๋๋ค.~
๋ด๊ฐ ํ๋ ธ์ด. ์ค์ ๋ก ๊ฐ๋ณ try
๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ก ์์ฑํ ์ ์์ผ๋ฏ๋ก ์ค์ฒฉ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
try( outf.Seek(linkstart, 0),
io.Copy(outf, exef),
)
์ฒซ ๋ฒ์งธ ์ค๋ฅ ํ์ try(โฆ)
๊ฐ ๋ฐํ๋ฉ๋๋ค.
try์ ๊ฐ์ ์์์ ์ค๋ฅ ํธ๋ค(๊ตฌ๋ฌธ ์คํ)์ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์์ฐจ์ ์ผ๋ก ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ์ง๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ Elixir์ with statement์ ๊ฐ์ ๊ฒ์ ์ ์ํ ๊ฒ์ ๋๋ค: https://www.openmymind.net/Elixirs-With-Statement/
golang์์ ์๋์ ๊ฐ์ด
switch a, b, err1 := go_func_01(),
apple, banana, err2 := go_func_02(),
fans, dissman, err3 := go_func_03()
{
normal_func()
else
err1 -> handle_err1()
err2 -> handle_err2()
_ -> handle_other_errs()
}
์ด๋ฐ ์ข ๋ฅ์ "Go๋ ๋ ์ ์ ๊ธฐ๋ฅ์ ์ ํธํฉ๋๋ค"์ "Go์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋ ์ข์์ง๋ ๊ฒ์ด ์๋๋ผ ๋ ์ปค์ง๋๋ค"์ ๋ํ ์๋ฐ์ ๋๊น? ์ ๋ชจ๋ฅด๊ฒ ์ด...
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์์ ๋ฐฉ์์ ์๋ฒฝํ๊ฒ ๋ง์กฑํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
if err != nil {
return โฆ, err
}
๊ทธ๋ฆฌ๊ณ ํ์คํ try
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ถ์ง ์์ต๋๋ค ... ์ด์ ๋ ๋ ๊ฐ์ง์ผ ์ ์์ต๋๋ค.
try
s๋ ์ค์ฒฉ๋ ์ ์์ต๋๋ค. ์ฆ, try( ... try( ... try ( ... ) ... ) ... )
, ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค.์ค๋ฅ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๊ตฌ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ง๋ฃจํ๋ค๊ณ ์๊ฐํ๋ค๋ฉด ํญ์ ๋์ผํ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์ต๋๊น?
๊ธ์, ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ํญ์ ๊ฐ์ ์ผ์ ํ๊ธฐ๋ฅผ ์ํ์ง ์๋๋ค๊ณ ์๊ฐํ ์ง ๋ชจ๋ฅด์ง๋ง, ๋น์ ์ ๋น์ ์ "ํธ๋ค๋ฌ" ํจ์๋ฅผ ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ ํ ์๋ ๋ฐฉ์์ผ๋ก ๊ธ์ ์ด๋ค๋ฉด ์๋ฌด ๊ฒ๋ ์์ง ์์ ๊ฒ์ ๋๋ค.
์ด ์ ์๋ ์๋ฃจ์ ์ defer ์ฑ๋ฅ์ด ๋ฌธ์ ๊ฐ ์๋๊ฐ์? ๋๋ ์ง์ฐ์ด ์๊ฑฐ๋ ์๋ ๊ธฐ๋ฅ์ ๋ฒค์น๋งํนํ์ผ๋ฉฐ ์๋นํ ์ฑ๋ฅ ์ํฅ์ด ์์์ต๋๋ค. ๋๋ ๊ทธ๋ฌํ ๋ฒค์น๋งํฌ๋ฅผ ์ํํ ๋ค๋ฅธ ์ฌ๋์ ๊ตฌ๊ธ๋งํ์ฌ 16๋ฐฐ์ ๋น์ฉ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ด ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋๋นด๋์ง ๊ธฐ์ต๋์ง ์์ง๋ง 4๋ฐฐ ๋๋ฆฐ ์๋๋ก ๋ฒจ์ด ์ธ๋ฆฝ๋๋ค. ๋ง์ ๊ธฐ๋ฅ์ ์คํ ์๊ฐ์ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๊ฑฐ๋ ์ ํ์ํฌ ์ ์๋ ๊ฒ์ด ์ด๋ป๊ฒ ์คํ ๊ฐ๋ฅํ ์ผ๋ฐ ์๋ฃจ์ ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๊น?
@eric-hawthorne ์ฑ๋ฅ ์ฐ๊ธฐ๋ ๋ณ๋์ ๋ฌธ์ ์ ๋๋ค. Try๋ ๋ณธ์ง์ ์ผ๋ก ์ง์ฐ์ด ํ์ํ์ง ์์ผ๋ฉฐ ์ง์ฐ ์์ด ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ง ์์ต๋๋ค.
@fabian-f ๊ทธ๋ฌ๋ ์ด ์ ์์ if err != nil ๋ธ๋ก์ ๋ฒ์ ๋ด์์ ๊ฐ ์ค๋ฅ ์ธ๋ผ์ธ์ ๋ํด ๋๊ตฐ๊ฐ๊ฐ ์ค๋ฅ๋ฅผ ๋ณ๋๋ก ์ฅ์ํ๋ ์ฝ๋ ๊ต์ฒด๋ฅผ ๊ถ์ฅํ ์ ์์ต๋๋ค. ์ด๋ ์๋นํ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ ๊ฒ์ ๋๋ค.
@eric-hawthorne ๋์์ธ ๋ฌธ์ ์ธ์ฉ:
Q: ์ค๋ฅ ๋ํ์ defer๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ ค์ง์ง ์์ต๋๊น?
A: ํ์ฌ defer ๋ฌธ์ ์ผ๋ฐ์ ์ธ ์ ์ด ํ๋ฆ์ ๋นํด ์๋์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ์ "์๋" ์ ๊ทผ ๋ฐฉ์๊ณผ ์ฑ๋ฅ ๋ฉด์์ ๋น๊ตํ ์ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฐ๊ธฐ์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ง์ฐ ์ฑ๋ฅ์ ์ฝ 30% ํฅ์์ํฌ ๊ฒ์ผ๋ก ์์๋๋ CL 171758๋ ์ฐธ์กฐํ์ญ์์ค.
์ฌ๊ธฐ Reddit์ ๋งํฌ๋ Rust์ ํฅ๋ฏธ๋ก์ด ์ด์ผ๊ธฐ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ๋ถ๋ถ์ 47:55 ์ ์์๋ฉ๋๋ค.
๋ด ๊ฐ์ฅ ํฐ ๊ณต๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ธ https://github.com/dpinela/mflg ์์ tryhard๋ฅผ ์๋ํ๊ณ ๋ค์์ ์ป์์ต๋๋ค.
--- stats ---
309 (100.0% of 309) func declarations
36 ( 11.7% of 309) func declarations returning an error
305 (100.0% of 305) statements
73 ( 23.9% of 305) if statements
29 ( 39.7% of 73) if <err> != nil statements
0 ( 0.0% of 29) <err> name is different from "err"
19 ( 65.5% of 29) return ..., <err> blocks in if <err> != nil statements
10 ( 34.5% of 29) complex error handler in if <err> != nil statements; cannot use try
0 ( 0.0% of 29) non-empty else blocks in if <err> != nil statements; cannot use try
15 ( 51.7% of 29) try candidates
ํด๋น ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ ๋๋ถ๋ถ์ ์ฝ๋๋ ๋ด๋ถ ํธ์ง๊ธฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ I/O๋ฅผ ์ํํ์ง ์์ผ๋ฏ๋ก ์ค๋ฅ ๊ฒ์ฌ๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ๋ฐ๋ผ์ try๋ฅผ ์ฌ์ฉํ ์ ์๋ ์์น๊ฐ ์๋์ ์ผ๋ก ์ ํ๋ฉ๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ try๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ฑํ์ต๋๋ค. git diff --stat
๋ ๋ค์์ ๋ฐํํฉ๋๋ค.
application.go | 42 +++++++++++-------------------------------
internal/atomicwrite/write.go | 35 ++++++++++++++---------------------
internal/clipboard/clipboard.go | 17 +++--------------
internal/config/config.go | 15 +++++++--------
internal/termesc/term.go | 5 +----
render.go | 8 ++------
6 files changed, 38 insertions(+), 84 deletions(-)
(์ ์ฒด ์ฐจ์ด์ ์ ์ฌ๊ธฐ .)
tryhard๊ฐ "๋ณต์กํ" ๊ฒ์ผ๋ก ๋ณด๊ณ ํ๋ 10๊ฐ์ ํธ๋ค๋ฌ ์ค 5๊ฐ๋ internal/atomicwrite/write.go์์ ๊ฑฐ์ง ๋ถ์ ์ ๋๋ค. ๊ทธ๋ค์ ์ค๋ฅ๋ฅผ ๋ํํ๊ธฐ ์ํด pkg/errors.WithMessage๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๋ํ์ ๊ทธ๋ค ๋ชจ๋์ ๋ํด ์ ํํ ๋์ผํ๊ธฐ ๋๋ฌธ์ try ๋ฐ deferred ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋๋ก ํด๋น ํจ์๋ฅผ ๋ค์ ์์ฑํ์ต๋๋ค. ๋๋์ด diff (+14, -21 ์ค)๋ก ๋๋ฌ์ต๋๋ค.
@@ -20,21 +20,20 @@ const (
// The file is created with mode 0644 if it doesn't already exist; if it does, its permissions will be
// preserved if possible.
// If some of the directories on the path don't already exist, they are created with mode 0755.
-func Write(filename string, contentWriter func(io.Writer) error) error {
+func Write(filename string, contentWriter func(io.Writer) error) (err error) {
+ defer func() { err = errors.WithMessage(err, errString(filename)) }()
+
dir := filepath.Dir(filename)
- if err := os.MkdirAll(dir, defaultDirPerms); err != nil {
- return errors.WithMessage(err, errString(filename))
- }
- tf, err := ioutil.TempFile(dir, "mflg-atomic-write")
- if err != nil {
- return errors.WithMessage(err, errString(filename))
- }
+ try(os.MkdirAll(dir, defaultDirPerms))
+ tf := try(ioutil.TempFile(dir, "mflg-atomic-write"))
name := tf.Name()
- if err = contentWriter(tf); err != nil {
- os.Remove(name)
- tf.Close()
- return errors.WithMessage(err, errString(filename))
- }
+ defer func() {
+ if err != nil {
+ tf.Close()
+ os.Remove(name)
+ }
+ }()
+ try(contentWriter(tf))
// Keep existing file's permissions, when possible. This may race with a chmod() on the file.
perms := defaultPerms
if info, err := os.Stat(filename); err == nil {
@@ -42,14 +41,8 @@ func Write(filename string, contentWriter func(io.Writer) error) error {
}
// It's better to save a file with the default TempFile permissions than not save at all, so if this fails we just carry on.
tf.Chmod(perms)
- if err = tf.Close(); err != nil {
- os.Remove(name)
- return errors.WithMessage(err, errString(filename))
- }
- if err = os.Rename(name, filename); err != nil {
- os.Remove(name)
- return errors.WithMessage(err, errString(filename))
- }
+ try(tf.Close())
+ try(os.Rename(name, filename))
return nil
}
์ค๋ฅ์ ์ฃผ์์ ์ถ๊ฐํ๋ ์ฒซ ๋ฒ์งธ ์ง์ฐ์ ์ฃผ๋ชฉํ์ธ์. nil ์ค๋ฅ์ ๋ํด nil์ ๋ฐํํ๋ WithMessage ๋๋ถ์ ํ ์ค์ ํธ์ํ๊ฒ ๋ง์ถ ์ ์์์ต๋๋ค. ์ด๋ฌํ ์ข ๋ฅ์ ๋ํผ๋ ์ ์์์์ ์ ์ํ ๊ฒ๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์์๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ฅธ "๋ณต์กํ" ํธ๋ค๋ฌ ์ค ๋ ๊ฐ๋ ReadFrom ๋ฐ WriteTo ๊ตฌํ์ ์์์ต๋๋ค.
var line string
line, err = br.ReadString('\n')
b.lines = append(b.lines, line)
if err != nil {
if err == io.EOF {
err = nil
}
return
}
func (b *Buffer) WriteTo(w io.Writer) (int64, error) {
var n int64
for _, line := range b.lines {
nw, err := w.Write([]byte(line))
n += int64(nw)
if err != nil {
return n, err
}
}
return n, nil
}
์ด๊ฒ๋ค์ ์ค์ ๋ก ์๋ํ ์ ์์์ผ๋ฏ๋ก ๊ทธ๋ฅ ๋์์ต๋๋ค.
๋ค๋ฅธ ๋ ๊ฐ๋ ์ด์ ๊ฐ์ ์ฝ๋๋ก, ๋ด๊ฐ ํ์ธํ ์ค๋ฅ์ ์์ ํ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค(๋จ์ํ ๋ํํ๋ ๊ฒ์ด ์๋). ๋๋ ๊ทธ๊ฒ๋ค๋ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ๋์์ต๋๋ค.
n, err := strconv.ParseInt(s[1:], 16, 32)
if err != nil {
return Color{}, errors.WithMessage(err, fmt.Sprintf("color: parse %q", s))
}
๋ง์ง๋ง ๊ฒ์ ์ค๋ฅ๊ฐ ์๋๋ผ๋ ํญ์ (0์ด ์๋) ๊ตฌ์ฑ์ ๋ฐํํ๋ ๊ตฌ์ฑ ํ์ผ์ ๋ก๋ํ๋ ํจ์์ ์์์ต๋๋ค. ์ด ์ค๋ฅ ๊ฒ์ฌ๋ ํ๋๋ง ์์์ผ๋ฏ๋ก ์๋์์ ์ ํ ๋์์ด ๋์ง ์์์ต๋๋ค.
-func Load() (*Config, error) {
- c := Config{
+func Load() (c *Config, err error) {
+ defer func() { err = errors.WithMessage(err, "error loading config file") }()
+
+ c = &Config{
TabWidth: 4,
ScrollSpeed: 1,
Lang: make(map[string]LangConfig),
}
- f, err := basedir.Config.Open(filepath.Join("mflg", "config.toml"))
- if err != nil {
- return &c, errors.WithMessage(err, "error loading config file")
- }
+ f := try(basedir.Config.Open(filepath.Join("mflg", "config.toml")))
defer f.Close()
- _, err = toml.DecodeReader(f, &c)
+ _, err = toml.DecodeReader(f, c)
if c.TextStyle.Comment == (Style{}) {
c.TextStyle.Comment = Style{Foreground: &color.Color{R: 0, G: 200, B: 0}}
}
if c.TextStyle.String == (Style{}) {
c.TextStyle.String = Style{Foreground: &color.Color{R: 0, G: 0, B: 200}}
}
- return &c, errors.WithMessage(err, "error loading config file")
+ return c, err
}
์ฌ์ค, ๋ฐํ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ์งํ๋ try์ ๋์์ ์์กดํ๋ ๊ฒ(๋ค์ดํค๋ ๋ฐํ๊ณผ ๊ฐ์)์ ์ ์๊ฐ์ ๋ฐ๋ผํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ ์ด๋ ต๊ฒ ๋๊ปด์ง๋๋ค. ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ๋ ์ถ๊ฐํ์ง ์๋ ํ ์ด ํน๋ณํ ๊ฒฝ์ฐ์๋ if err != nil
๋ฅผ ๊ณ ์ํฉ๋๋ค.
TL;DR: try๋ ์ด ์ฝ๋์ ์๋นํ ์์ ๋น์จ(์ค ์ ๊ธฐ์ค)์์๋ง ์ ์ฉํ์ง๋ง ๋์์ด ๋๋ ๊ฒฝ์ฐ์๋ ์ ๋ง ๋์์ด ๋ฉ๋๋ค.
(์ฌ๊ธฐ์ ๋ฉ์ฒญ์ด). ์ฌ๋ฌ ์ธ์์ ๋ํ ๋ ๋ค๋ฅธ ์์ด๋์ด. ์ด๋์:
package trytest
import "fmt"
func errorInner() (string, error) {
return "", fmt.Errorf("inner error")
}
func errorOuter() (string, error) {
tryreturn errorInner()
return "", nil
}
func errorOuterWithArg() (string, error) {
var toProcess string
tryreturn toProcess, _ = errorOuter()
return toProcess + "", nil
}
func errorOuterWithArgStretch() (bool, string, error) {
var toProcess string
tryreturn false, ( toProcess,_ = errorOuterWithArg() )
return true, toProcess + "", nil
}
์ฆ, tryreturn์ ๋ง์ง๋ง์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์ ๋ฐํ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
๊ฐ์ด ์์ผ๋ฉด ์คํ์ด ๊ณ์๋ฉ๋๋ค.
๋ด๊ฐ ๋์ํ๋ ์์น:
-
try
์ฒ๋ผ) ๋ฐํํ๋ ๋ชจ๋ ๋ด์ฅ ํจ์๋ ์ต์ํ ๋ช
๋ น๋ฌธ์ด์ด์ผ ํ๋ฉฐ ์ด์์ ์ผ๋ก๋ ๊ทธ ์์ return์ด๋ผ๋ ๋จ์ด๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ค์ ๋งํ์ง๋ง, Go์ ์ ์ด ํ๋ฆ์ ๋ช
์์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.๋ด๊ฐ ์ง์ํ๋ ๊ตฌ๋ฌธ:
-
reterr _x_
๋ฌธ( if err != nil { return _x_ }
๊ตฌ๋ฌธ ์คํ, ๋ฐํํ ๊ฒ์์ ๋ํ๋ด๊ธฐ ์ํด ๋ช
์์ ์ผ๋ก ๋ช
๋ช
๋จ)๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ํ๋์ ๋ฉ์ง ์งง๊ณ ๋ช ํํ ์ค์ด ๋ ์ ์์ต๋๋ค.
func foo() error {
a, err := bar()
reterr err
b, err := baz(a)
reterr fmt.Errorf("getting the baz of %v: %v", a, err)
return nil
}
3์ค ๋์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func foo() error {
a, err := bar()
if err != nil {
return err
}
b, err := baz()
if err != nil {
return fmt.Errorf("getting the baz of %v: %v", a, err)
}
return nil
}
๋ด๊ฐ ๋์ํ์ง ์๋ ๊ฒ๋ค:
reterr
์ ๊ฐ์ด ๋งค์ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํน์ ๋งคํฌ๋ก๋ฅผ ๋์ ์ ๊ณตํด์ผ ํฉ๋๋ค(Go๋ฅผ ์์ฑํ๋ ๋ชจ๋ ์ฌ๋์ reterr์ ์ด์ ์ ๋๋ฆด ๊ฒ์
๋๋ค).@Qhesz ์๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
func foo() error {
a, err := bar()
try(err)
b, err := baz(a)
try(wrap(err, "getting the baz of %v", a))
return nil
}
@reuse ๊ทธ ์ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ ๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ชฐ๋์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ฝ๊ฐ ๊ฑฐ์ฌ๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ๊ทธ๋ฐ์ง์ ๋ํด ์๊ฐ๋ฝ์ ๋๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
"์๋"๋ ๊ทธ๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ ์ด์ํ ๋จ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. "try(action())"์ ์์ด๋ก ์๋ฏธ๊ฐ ์๋ ๋ฐ๋ฉด "try(value)"๋ ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ๋จ์ด์๋ค๋ฉด ๋ ์ข์์ ํ ๋ฐ.
๋ํ try(wrap(...))
๋ wrap(...)
๋จผ์ ํ๊ฐํ์ง ์์ต๋๊น? ๊ทธ ์ค ์ด๋ ์ ๋๊ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์ต์ ํ๋๋ค๊ณ ์๊ฐํ์ญ๋๊น? (๋จ์ง if err != nil
๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด?)
๋ํ #32611๋ ๋ชจํธํ๊ฒ ์ ์ฌํ ์ ์์ด๋ฉฐ, ๋๊ธ์๋ ํต์ฌ Go ํ๊ณผ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์, ํนํ ํค์๋์ ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์ ์ฐจ์ด์ ์ ๋ํ ๊ณ๋ชฝ์ ์ธ ์๊ฒฌ์ด ์์ต๋๋ค.
@Qhesz ๋ค์ด๋ฐ์ ๋ํด ๋์ํฉ๋๋ค. "check(action())" ๋๋ "check(err)"์ด ์ ์ฝ๊ธฐ ๋๋ฌธ์ check
๊ฐ ๋ ์ ์ ํ ์ ์์ต๋๋ค.
@reusee ์๋ ์ด์ ๋์์ธ์ด check
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ์์ด๋ฌ๋ํฉ๋๋ค.
19๋ 7์ 6์ผ์ mirtchovski [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
$ tryhard .
--- ํต๊ณ ---
2930(2930์ 100.0%) ํจ์ ์ ์ธ
1408(2930์ 48.1%) ํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํจ
[ ... ]
์ฌ๊ธฐ์ ์ฅ๋์ด ์๋ ์ ์์ต๋๋ค.
๋ง์ง๋ง ์ธ์๋ก ์ค๋ฅ"?
๋ฃจ์์ค.
์์ ๋ด ์ง๋ฌธ์ ๋ํ ์ต์ข
์๊ฐ์ ์ฌ์ ํ โโerr์ด nil์ด ์๋ ๊ฒฝ์ฐ์๋ง ์คํ๋๋ wrap() ๊ตฌ๋ฌธ try(err, wrap("getting the baz of %v: %v", a, err))
์ ์ ํธํฉ๋๋ค. try(wrap(err, "getting the baz of %v", a))
๋์ .
@Qhesz wrap
์ ๊ฐ๋ฅํ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func wrap(err error, format string, args ...interface{}) error {
if err == nil {
return nil
}
return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}
์ปดํ์ผ๋ฌ๊ฐ wrap
์ธ๋ผ์ธํ ์ ์์ผ๋ฉด wrap
#$ ์ ๊ณผ if err != nil
์ ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
@reusee if err == nil
๋ง์ํ์ ๊ฒ ๊ฐ์์ ;)
@Qhesz
wrap
์ ๊ฐ๋ฅํ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.func wrap(err error, format string, args ...interface{}) error { if err == nil { return nil } return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err) }
์ปดํ์ผ๋ฌ๊ฐ
wrap
์ธ๋ผ์ธํ ์ ์์ผ๋ฉดwrap
#$ ์ ๊ณผif err != nil
์ ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
%w
์ด(๊ฐ) ์ ํจํ์ง ์์ต๋๋ค go
verb
(๊ทธ๊ฐ %v๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค...)
๋ฐ๋ผ์ ํค์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง๋ง ๋ด์ฅ์ด ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
๋๋ ์ด ์ ์์ ๋์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
try
$๊ฐ ์๋๋ผ check
์์ต๋๋ค.panic()
์ ๊ฐ์ ํํ์ ๋ด์์ ์ ํจํ์ง ์์ต๋๋ค.check!(...)
์ด์ง๋ง ํน์ ๊ตฌ๋ฌธ์ ๋ํด ๊ฐํ ์๊ฒฌ์ด ์์ต๋๋ค)~ Changed my mind๊ทธ๋ฌ๋ฉด ํ๋ฅญํ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ๋ง๋๋ ๋ชจ๋ ํจ์ ํธ์ถ์์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ ๋์ ๋ํ ์ฝ๊ฐ์ ์ฌ๊ณผ, ๋๋ ์ด์ ์์ผ ๋ด๊ฐ ๋ฐฉ๊ธ ๋งํ ๊ฒ๊ณผ ๊ฑฐ์ ์ ์ฌํ ๊ฐ์๋ฅผ ์์ ๋๊ธ์ ์ฐพ์์ต๋๋ค.
@deanveloper ์์ ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@olekukonko @Qhesz %w๊ฐ ํ์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค: https://tip.golang.org/pkg/fmt/#Errorf
์ด ์ฃผ์ ์ ๋ชจ๋ ๋ด์ฉ์ ์ฝ์ง ๋ชปํ ์ ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ฐ ๋ณด์ง ๋ชปํ ๊ฒ์ ๋ํด ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค.
Go1์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ฐ์ค ์ ์๋ ๋ ๊ฐ์ง ๊ฐ๋ณ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ ํํ์ง๋ง ์ฝ๊ฐ ๋ฐ๋ณต์ ์ธ "์ข์" ์ฝ๋; ๋ฐ "๋์" ์ฝ๋๊ฐ ์๋ชป๋์์ง๋ง ๋๋ถ๋ถ ์๋ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ if-err ๋ธ๋ก์ ์ค์ ๋ก ์ผ๋ถ ๋ ผ๋ฆฌ๊ฐ ์์ด์ผ ํ๋ฉฐ try ์คํ์ผ ๊ตฌ์ฑ์ผ๋ก ์ด๋ํ๋ฉด ์ถ๊ฐ ๋ ผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง์ผ๋ก์จ ์ด ์ข์ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
๋ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์๋ชป๋ ์ฝ๋๋ ์ข ์ข ๋ค์๊ณผ ๊ฐ์ ํ์์ ๋๋ค.
..., _ := might_error()
์๋๋ฉด ๊ทธ๋ฅ
might_error()
์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ์๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์๊ฐ์ ํ ์ ํ ๋งํผ ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ํ๊ธฐ๋ฅผ ํฌ๋งํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ธ๋ ฅ์ด ๊ฑฐ์ ํ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ๋ ์ ์์ต๋๋ค.
..., XXX := might_error()
์ฌ๊ธฐ์ XXX๋ "์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ์คํ์ ์ค์งํด์ผ ํจ"์ ์๋ฏธํ๋ ๊ธฐํธ์ ๋๋ค. ์ด๊ฒ์ ์ด๊ฒ์ด ์์ฐ ์ค๋น ์ฝ๋๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋ถ๋ช ํ ํ ๊ฒ์ ๋๋ค. ์์ฑ์๋ ์ค๋ฅ ์ฌ๋ก๋ฅผ ์๊ณ ์์ง๋ง ๋ฌด์์ ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ์ง ์์์ต๋๋ค.
๋ฌผ๋ก ์ด๊ฒ์ returnif handle(err)
์ ํ ์๋ฃจ์
์ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
๋๋ ํ๋ฅญํ๊ฒ ์ต์ํ์ ๋์์ธ์ ๋ํ ๊ธฐ์ฌ์๋ค์ ๋ํ ์นญ์ฐฌ๊ณผ ํจ๊ป ๊ท ํ์ ์ํด ์๋์ ๋ฐ๋ํฉ๋๋ค. ์ ๋ ๋ฐ๋ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง ์ผ๋ฆฌ ์ด๋ตํฐ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ๊ธฐ์ ์ฝ๋๋ฅผ ์์ฐํ๊ณ ์์ต๋๋ค. ์ ๋ AWS์ Serverless ๊ทธ๋ฃน์์ ์ผํ๊ณ ์์ผ๋ฉฐ ์ฌํด ๋ง์ Go ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ์ถ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ฒดํฌ์ธ์ ์ ๊ฐ ์ง์ ์์ฑํ ๊ฒ์ ๋๋ค. ์ ๋ C, Perl, Java, Ruby๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ ์ ๋ง ์ค๋๋ ์ฌ๋์ ๋๋ค. ๋ด ๋ฌธ์ ๋ ๋งค์ฐ ์ ์ฉํ ํ ๋ก ์์ฝ์ ์ด์ ์ ๋ํ๋ฌ์ง๋ง ์ฌ์ ํ ๋ฐ๋ณตํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
if err != nil { return }
์ ๊ฑฐ์ ๊ฐ์ต๋๋ค(์ ์๊ฐ์๋?) ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ช
๋ช
๋ ๋ฐํ ๊ฐ์ ์ข์ํ๊ณ ์ค๋ฅ ๋ฐ์ฝ๋ ์ดํฐ์ ์ด์ ์ ๊ณ ๋ คํ ๋ ๋ช
๋ช
๋ err ๋ฐํ ๊ฐ์ ๋น์จ์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋จ์กฐ ์ฆ๊ฐ; ์๋์ ์ด์ ์ ์ฝํ์ํต๋๋ค.๋ค์ ํ๋ฒ ๋ฉ์ง ์ ์๊ณผ ๊ฑด์ค์ ์ธ ํ ๋ก ์ ๋ํด ์ปค๋ฎค๋ํฐ์ ์ถํ์ ๋ง์์ ์ ํฉ๋๋ค.
๋๋ ์ง๋ ๋ช ๋
๋์ ์ต์ํ์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ฝ๋ ๋ฐ ์๋นํ ์๊ฐ์ ํ ์ ํ์ต๋๋ค. ์ง๋ฃจํจ์๋ ๋ถ๊ตฌํ๊ณ if err != nil
๋ ๋น๋ก ์ธ๋ก๋ก ์ฅํฉํ์ง๋ง ๊ด์ฉ๊ตฌ๋ฅผ ์ฝ๊ธฐ์ ๋งค์ฐ ์ฝ๊ฒ ์ ๊ณตํฉ๋๋ค. try()
์ด ๋ฌ์ฑํ๋ ค๊ณ ํ๋ ๊ฒ์ ์ ์ ์ ๊ณ ๊ทํ๊ณ ํด์ผ ํ ์ผ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ด ๊ธฐ๋ฅ์ ์ฐ์ ์์๊ฐ ์๋ชป๋์ด ์ ์์ด ๋๋ฌด ์ผ์ฐ ๋น์ ๋ณด๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. xerr
์ดํ ๋ฐ ์ ๋ค๋ฆญ์ 6-12๊ฐ์ ๋์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์์ ๋ง๋ฆฌ๋ค์ด๋ํ ๊ธฐํ๋ฅผ ๊ฐ์ก์ต๋๋ค.
try()
๋์
์ ๊ณ ์ํ๊ณ ๊ฐ์น ์๋ ์ ์์ผ๋ก ๋ณด์
๋๋ค(์: if
์ 29% - ~40% ๋ $ if err != nil
ํ์ธ์ ์ํ ๊ฒ์
๋๋ค). ํ๋ฉด์ ์ผ๋ก๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ฉด ๊ฐ๋ฐ์ ๊ฒฝํ์ด ํฅ์๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. try()
๋์
์ผ๋ก ์ธํ ํธ๋ ์ด๋์คํ๋ ์ฝ๊ฐ์ ํน์ ์ฌ๋ก์์ ์ธ์ง ๋ถํ์ ํํ๋ก ๋ฐ์ํฉ๋๋ค. Go์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ ๋จ์ํ๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์๋ฃํ๋ ๋ฐ ํ์ํ ์ธ์ง ๋ถํ๊ฐ โโ๋งค์ฐ ์ ๋ค๋ ๊ฒ์
๋๋ค(์ธ์ด ์ฌ์์ด ํฌ๊ณ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์๋ C++์ ๋นํด). ์ ์ ์ ๋ณต์ก์ฑ์ ์ ๋์ ๋ฉํธ๋ฆญ์ ๋์ด๋ ๋๊ฐ๋ก ํ๋์ ์ ๋์ ๋ฉํธ๋ฆญ( if err != nil
์ LoC)์ ์ค์ด๋ ๊ฒ์ ์ผํค๊ธฐ ํ๋ ์์ฝ์
๋๋ค(์ฆ, ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ฐ์ฅ ์์คํ ์์์ธ ๋๋์ ๋ํ ์ ์ ์ ์ธ๊ธ).
ํนํ try()
๊ฐ go
, defer
๋ฐ ๋ช
๋ช
๋ ๋ฐํ ๋ณ์๋ก ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ๋ํ ์๋ก์ด ํน์ ์ฌ๋ก๋ try()
๋ฅผ ์ฝ๋๋ฅผ ๋ ๋งค๋ ฅ์ ์ผ๋ก ๋ง๋ญ๋๋ค. Go ์ฝ๋์ ๋ชจ๋ ์์ฑ์ ๋๋ ๋
์๋ Go๋ฅผ ์ ์ ํ๊ฒ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด ์ด๋ฌํ ์๋ก์ด ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์์์ผ ํ๊ณ ์ด์ ์๋ ๊ทธ๋ฌํ ๋ถ๋ด์ด ์์์ต๋๋ค. ๋๋ ์ด๋ฌํ ์ํฉ์ ๋ํ ๋ช
์์ ์ธ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ํนํ ์ ์๋์ง ์์ ์ด๋ค ํํ์ ํ๋์ ๋์
ํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ, ๊ทธ๋ฌ๋ ๊ทธ๋ค์ด ์ฒ์๋ถํฐ ์กด์ฌํด์ผ ํ๋ค๋ ์ฌ์ค์ ์ด๊ฒ์ด ํ์ฌ๋ก์๋ ๋ถ์์ ํ๋ค๋ ๊ฒ์ ๋ํ๋
๋๋ค. ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ ์ด์ธ์ ๊ฒ์ด๋ผ๋ฉด ํ์ฉ๋ ์ ์์ง๋ง ์ด๋ฏธ ์ ์ฒด LoC์ ์ต๋ 40%์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ฉด ์ด๋ฌํ ํน๋ณํ ๊ฒฝ์ฐ๋ ์ ์ฒด ์ปค๋ฎค๋ํฐ ๋ฐ ์ด๋ ์ด ์ ์์ ์ธ์ง ๋ถํ ๋น์ฉ์ ์ฐ๋ ค๋ฅผ ์ ๋นํํ ๋งํผ ์ถฉ๋ถํ ๋์ ์์ค์ผ๋ก ๋์
๋๋ค.
ํน๋ณํ ๊ฒฝ์ฐ ๊ท์น์ด ์ด๋ฏธ ๊ณ ์ ๋ ๋ณ์์ ๊ณ ์ ๋์ง ์์ ๋ณ์์ธ ๋ฏธ๋๋ฌ์ด ์ธ์ง ๊ธฐ์ธ๊ธฐ์ธ Go์ ๋ ๋ค๋ฅธ ์๊ฐ ์์ต๋๋ค. ๋ณ์๋ฅผ ๊ณ ์ ํด์ผ ํ๋ ๊ฒ์ ์ค์ ๋ก ์ดํดํ๊ธฐ ์ด๋ ต์ง ์์ง๋ง ์ฌ๊ธฐ์๋ ์์์ ์ธ ๋์์ด ์๊ณ ์ด๋ก ์ธํด ์์ฑ์, ๋
์ ๋ฐ ๋ฐํ์ ์ ์ปดํ์ผ๋ ์คํ ํ์ผ์์ ์ผ์ด๋๋ ์ผ ์ฌ์ด์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋์น๊ฒ ๋ฉ๋๋ค. scopelint
์ ๊ฐ์ ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋ง์ ๊ฐ๋ฐ์๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค(๋๋ ๋ ๋์ ๊ฒฝ์ฐ์๋ ์๊ณ ์์ง๋ง ๋์น๊ธฐ ๋๋ฌธ์ ๋์น๋ ๋ฌธ์ ๊ฐ ์์). ์๋ํ๋ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ํ๋ ๊ฐ์ฅ ์๊ธฐ์น ์๊ณ ์ง๋จํ๊ธฐ ์ด๋ ค์ด ๋ฐํ์ ๋ฒ๊ทธ ์ค ์ผ๋ถ๋ ์ด ํน์ ๋ฌธ์ ์์ ๋น๋กฏ๋์์ต๋๋ค(์: ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐ๋ณตํ๊ณ ์์๋๋ ๊ณ ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋์ N ๊ฐ์ฒด ๋ชจ๋ ๋์ผํ ๊ฐ์ผ๋ก ์ฑ์์ง). try()
์ ์คํจ ๋๋ฉ์ธ์ ๊ณ ์ ๋ ๋ณ์์ ๋ค๋ฅด์ง๋ง ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๋๋ค์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
IMNSHO, xerr
๋ฐ ์ ๋ค๋ฆญ ์ ์์ if err != nil
์ ์์ฉ๊ตฌ๋ฅผ ์ ๋ณตํ๊ธฐ ์ ์ 6-12๊ฐ์ ๋์ ํ๋ก๋์
๋จ๊ณ์์ ๋ฒ ์ดํนํ ์๊ฐ์ด ํ์ํฉ๋๋ค. ์ ๋ค๋ฆญ์ ๋ณด๋ค ํ๋ถํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์๋ก์ด ๊ด์ฉ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ํ ๊ธธ์ ์ด ๊ฒ์
๋๋ค. ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๊ด์ฉ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ฑ์ฅํ๊ธฐ ์์ํ๋ฉด ๊ทธ๋์์ผ try()
๋๋ ๊ธฐํ์ ๋ํ ๋
ผ์๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ ๋ค๋ฆญ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ์๋ ์ฒํ์ง๋ ์์ง๋ง ์ ๋ค๋ฆญ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ฑฐ์ ํ์คํ ์ฌ์ฉ๋๋ ํ๋ถํ ์ ํ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ํ์คํ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ค๋ฆญ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์นจํฌํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ถ๊ฐ๋๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด try()
์ ์ฉ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ๋ช
ํ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค.
์ ๊ฐ ์ฐ๋ คํ๋ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try()
๋ ๋
๋ฆฝ์ ์ผ๋ก ๋ณต์กํ์ง ์์ง๋ง ์ด์ ์๋ ์กด์ฌํ์ง ์์๋ ์ธ์ง ์ค๋ฒํค๋์
๋๋ค.err != nil
๋ฅผ try()
์ ๊ฐ์ ๋ ๋์์ผ๋ก ๋ฒ ์ดํนํจ์ผ๋ก์จ ์ธ์ด๋ ์คํ ์๋ก ์ํ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก err
์ฌ์ฉ์ ๋ฐฉ์งํฉ๋๋ค.try()
๋ ๊ฐ์ ์ ์ธ ์๋ฆฌํจ์ฒ๋ผ ๋๊ปด์ง์ง๋ง ๋๋ถ๋ถ์ Go ์ธ์ด๊ฐ ์ฆ๊ธฐ๋ ๋ช
์์ ์ด๊ณ ๋ช
๋ฐฑํ ํ
์คํธ๋ฅผ ๋ง์กฑ์ํฌ ๋งํผ ์๋ฆฌํ์ง ์์ต๋๋ค. ์ฃผ๊ด์ ์ธ ๊ธฐ์ค์ ํฌํจํ๋ ๋๋ถ๋ถ์ ๊ฒ๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ฒ์ ๊ฐ์ธ์ ์ธ ์ทจํฅ๊ณผ ๊ฒฝํ์ ๋ฌธ์ ์ด๋ฉฐ ์๋ํํ๊ธฐ ์ด๋ ต์ต๋๋ค.switch
/ case
๋ช
๋ น๋ฌธ ๋ฐ ์ค๋ฅ ๋ํ์ ์ฌ์ฉํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ด ์ ์์ ์ํด ์๋์ง ์์ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋์น ๊ธฐํ๋ก ์ธํด ์ด ์ ์์ด ์๋ ค์ง์ง ์์ ๊ฒ์ ์๋ ค์ง์ง ์์ ๊ฒ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ถ๋๋ฌ์ํ๋ค๊ณ ๋ฏฟ๊ฒ ๋ฉ๋๋ค. -์๋ ค์ง (๋๋ ์ต์
์ ๊ฒฝ์ฐ ์๋ ค์ง-์ ์ ์์).๋ง์ง๋ง์ผ๋ก try()
์ ์์ ์ฐ๋ฆฌ๊ฐ C++๋ฅผ ๋จ๊ฒจ๋๊ณ ํ์ถํ ๊ฒ๊ณผ ๊ฐ์ ์ธ์ด๋ณ ๋์์ค์ ํ์๋ฅผ ๋ง๊ณ ์๋ ๋์ ์๋ก์ด ๋ํ๊ตฌ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
TL;DR: #nevertry
๋ฐ์์ด ์๋๋ผ "์ง๊ธ์ ์๋๊ณ , ์์ง์ ์๋๊ณ , xerr
์ ์ ๋ค๋ฆญ์ด ์ํ๊ณ์์ ์ฑ์๋ ํ์ ๋ค์ ์๊ฐํด ๋ด
์๋ค. "
์์ ๋งํฌ๋ #32968์ ์์ ํ ๋ฐ๋ ์ ์์ ์๋์ง๋ง try
๋งคํฌ๋ก๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํํ ์ค์ฒฉ ๊ธฐ๋ฅ์ ๋ํ ๋ด ์๊ฒฌ ๋ถ์ผ์น์ ๊ธฐ๋ฐํฉ๋๋ค. #32946๊ณผ ๋ฌ๋ฆฌ ์ด๊ฒ์ ์ฌ๊ฐํ ์ ์์ด๋ฉฐ ์ฌ๊ฐํ ๊ฒฐํจ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฐ์ท:
check
๋งคํฌ๋ก๋ ํ ์ค์ง๋ฆฌ๊ฐ ์๋๋๋ค .๋ด์ฅ๋์ด ์์ผ๋ฉฐ ํ ์ค์ ์ค์ฒฉ๋์ง ์์ผ๋ฉฐ try
๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ํ๋ฆ์ ํ์ฉํ๊ณ ๋ด๋ถ์ ์ฝ๋ ๋ชจ์์ ๋ํด ๊ธฐ๋ํ์ง ์์ต๋๋ค. ๋ฒ๊ฑฐ๋ฒ์ ๋ฐํ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
// built-in 'check' macro signature:
func check(Condition bool) {}
check(err != nil) // explicit catch: label.
{
ucred, err := getUserCredentials(user)
remote, err := connectToApi(remoteUri)
err, session, usertoken := remote.Auth(user, ucred)
udata, err := session.getCalendar(usertoken)
catch: // sad path
ucred.Clear() // cleanup passwords
remote.Close() // do not leak sockets
return nil, 0, err // dress before leaving
}
// happy path
// implicit catch: label is above last statement
check(x < 4)
{
x, y = transformA(x, z)
y, z = transformB(x, y)
x, y = transformC(y, z)
break // if x was < 4 after any of above
}
์ด ์ค๋ ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ต๋ํ ๋ง์ด ์ฝ์์ต๋๋ค. ๋๋ ์ฌ๋ฌผ์ ์๋ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
๋ด ์ด์ :
๋ํ ์ ์์ ์๋ชป ์ดํดํ์ ์๋ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ธ์ด์ try
๊ตฌ๋ฌธ์ ์ฌ๋ฌ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ชจ๋ ์ ์ฌ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ ์ ํ์ด ํ์ํฉ๋๋ค. ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ณ ์ข
์ข
์ผ์ข
์ ์ฌ์ ์ค๋ฅ ์ํคํ
์ฒ ๋ฐ ์ค๊ณ ๋
ธ๋ ฅ์ ์ถ๊ฐํฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ(๋ด๊ฐ ์ง์ ์ํ) ์ฌ๋ฌ ์๋ ๋ธ๋ก์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๊ตฌํ์ด ํ๋ ค์ง๋๋ค.
try
์ Go ๊ตฌํ์ด ๋ค๋ฅธ ์ธ์ด์ ๊ตฌํ๊ณผ ๋ค๋ฅด๋ฉด ๋ ๋ง์ ํผ๋์ด ๋ฐ์ํฉ๋๋ค.
๋ด ์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ๋๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ ์ธ์งํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ์์ ๋ํ ๋์ ๋นํ์ ์๋ ๊ทธ๋๋ก ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
์ฌ์์์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ ๋ค์ ๋ ๊ฐ์ง ์์ฒญ์ ๋๋ค.
๋ฐ๋ผ์ go ๋ฌธ์์ ํธ์ถ๋ ํจ์๋ก try๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
...
๋ฐ๋ผ์ defer ๋ฌธ์์๋ ํธ์ถ๋ ํจ์๋ก try๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ ์ด๊ฒ์ด true์ธ ์ฒซ ๋ฒ์งธ ๋ด์ฅ ํจ์์ผ ๊ฒ์
๋๋ค( defer
๋ฐ go
a panic
๋ ๊ฐ๋ฅ) . ๊ฒฐ๊ณผ๋ฅผ ๋ฒ๋ฆด ํ์๊ฐ ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ํน๋ณํ ์ ์ด ํ๋ฆ ๊ณ ๋ ค ์ฌํญ์ ์ ๊ณตํด์ผ ํ๋ ์๋ก์ด ๋ด์ฅ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ ํฐ ์์ฒญ์ฒ๋ผ ๋ณด์ด๋ฉฐ go์ ์๋ฏธ๋ก ์ ์ผ๊ด์ฑ์ ๊นจ๋จ๋ฆฝ๋๋ค. go์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ด ํ๋ฆ ํ ํฐ์ ํจ์๊ฐ ์๋๋๋ค .
๋ด ๋ถ๋ง์ ๋ํ ๋ฐ๋ก ์ defer
๋ฐ go
a panic
๋ฅผ ํ ์ ์๋ ๊ฒ์ ์๋ง๋ ์ฐ์ฐ์ผ ๋ฟ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ด ์์ ์ defer
๋ฐ go
๊ฐ ํญ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์ด ์ค์ํ ๊ฒ์ด ์๋๋ผ ์ด ์ ์์ ์ํด go์์ ํจ์์ ์๋ฏธ๋ก ์ ์ผ๊ด์ฑ์ด ๊นจ์ก๋ค๋ ๊ฒ์
๋๋ค. defer
๋๋ go
์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฒฐ์ฝ ์ด์น์ ๋ง์ง ์๋ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์๋ ํจ์๊ฐ ๋ง์ด ์์ ์ ์์ง๋ง ์๋ฏธ์ ๊ทธ๋ด ์ ์๋ ๋ช
ํํ ์ด์ ๋ ์์ต๋๋ค. ์ ์ด ๋นํธ์ธ์ด go์์ ํจ์์ ์๋ฏธ๋ก ์ ๊ณ์ฝ์์ ๋ฉด์ ๋๋๊ฐ?
@griesemer ๊ฐ ์ด ์ ์์ ๋ํ ๋ฏธํ์ ์๊ฒฌ์ด ํ ๋ก ์ ์ฝ์ ๋๋ ๊ฒ์ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ๋๋ค์ด ์ด ์ ์์ ๋ฏธํ์ ์ผ๋ก ์ญ๊ฒน๋ค๊ณ ์๊ฐํ๋ ํ ๊ฐ์ง ์ด์ ๋ ๊ทธ๋ค์ด ๊ธฐ๋ฅ์ผ๋ก ํฉ์ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
try with signature(์์ฌ ์ฝ๋)๋ผ๋ ์๋ก์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์ ์ ์ํฉ๋๋ค.
func try(expr) (T1, T2, โฆ Tn)
์ด๊ฒ์ด ๊ธฐ๋ฅ์ด ์๋๋ผ๋ ์ ์ ์ ์ธํ๊ณ (์ ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ํ๋). ์ฌ์ค์ ์ด๊ฒ์ ์ธ์ด ์ฌ์์ ๋ด์ฅ๋ ์ผํ์ฉ ๋งคํฌ๋ก์ ๋๋ค(ํ์ฉ๋๋ ๊ฒฝ์ฐ). ์ด ์๋ช ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํจ์๊ฐ ํธ์ถ๋ ํํ์์ ๋งํ ๊ฒ๋ ์๊ณ ์ ๋ค๋ฆญ ํํ์์ ์ธ์๋ก ๋ฐ์๋ค์ธ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์ฌ์์์ "ํํ์"์ด๋ผ๋ ๋จ์ด๊ฐ ์ฌ์ฉ๋ ๋๋ง๋ค ์ด๋ ํธ์ถ๋์ง ์์ ํจ์์ ๊ฐ์ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ปจํ
์คํธ์์ ๋ฐํ ๊ฐ์ด ์๋ฏธ์ ์ผ๋ก ํ์ฑ์ธ ๊ฒฝ์ฐ "ํธ์ถ๋" ํจ์๋ฅผ ํํ์์ผ๋ก ์๊ฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? IE์์๋ ํธ์ถ๋ ํจ์๋ฅผ ๋ฐํ ๊ฐ์ผ๋ก ์๊ฐํฉ๋๋ค. ๋ถ๋ช
ํ ์์ธ๋ go
๋ฐ defer
์ด๋ฉฐ ๋ ๋ค ๋ด์ฅ ํจ์๊ฐ ์๋ ์์ ํ ํฐ์
๋๋ค.
๋ํ ์ด ์ ์์ ์์ฒด ํจ์ ์๋ช ์ด ์ฌ๋ฐ๋ฅด์ง ์๊ฑฐ๋ ์ ์ด๋ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ์ค์ ์๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func try(R1, R2, ... Rn) ((R|T)1, (R|T)2, ... (R|T)(n-1), ?Rn)
// where T is the return params of the function that try is being called from
// where `R` is a return value from a function, `Rn` must be an error
// try will return the R values if Rn is nil and not return Tn at all
// if Rn is not nil then the T values will be returned as well as Rn at the end
try
๊ฐ ์ธ์์ ํจ๊ป ํธ์ถ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?try(arg1, arg2,..., err)
์ด๊ฒ์ด ํด๊ฒฐ๋์ง ์์ ์ด์ ๋ try
๊ฐ expr
์ธ์๋ฅผ ์๋ฝํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ธ์๋ ์ค์ ๋ก ํจ์์์ n๊ฐ์ ๋ฐํ ์ธ์์ ๋ค๋ฅธ ๊ฒ์ ๋ํ๋ด๋ ๊ฒ์ผ๋ก, ์ฌ์ค์ ๋ ์ ๋ณด์ฌ์ค๋๋ค. ์ด ์ ์์ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง์ ๋ํ ์๋ฏธ๋ก ์ ์ผ๊ด์ฑ์ ๊นจ๋จ๋ฆฝ๋๋ค.
์ด ์ ์์ ๋ํ ๋์ ๋ง์ง๋ง ๋ถ๋ง์ ๊ทธ๊ฒ์ด ๋ด์ฅ ํจ์์ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ๋์ฑ ๊นจ๋จ๋ ธ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ด์ฅ ํจ์๊ฐ ๋๋๋ก "์ ์์ ์ธ" ๊ธฐ๋ฅ์ ์๋ฏธ๋ก ์ ๊ท์น(๋ณ์์ ํ ๋นํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์)์์ ๋ฉด์ ๋ ํ์๊ฐ ์๋ค๋ ์์ด๋์ด์ ๋ฌด๊ด์ฌํ์ง ์์ง๋ง, ์ด ์ ์์ " golang ๋ด๋ถ์ ๊ธฐ๋ฅ์ ์ ์ดํ๋ โโ๊ฒ์ผ๋ก ๋ณด์ด๋ "์ ์" ๊ท์น.
์ด ์ ์์ try
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๋ก์ด ๊ฒ์ผ๋ก ๋ง๋ญ๋๋ค. ํ ํฐ๋ ์๋๊ณ ๊ธฐ๋ฅ๋ ์๋๋๋ค. ๋ ๋ค ์๋ฏธ๋ก ์ ์ผ๊ด์ฑ์ ๋ง๋๋ ์ธก๋ฉด์์ ์ค์ ํ๊ธฐ์๋ ์ข์ง ์์ ์ ๋ก์ฒ๋ผ ๋ณด์
๋๋ค. ์ธ์ด.
์๋ก์ด ์ ์ด ํ๋ฆ์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ goto
๋ฑ์ ์์ ํ ํฐ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด ํ ๋ก ์์ ์ ์์ ํธํฌํด์๋ ์ ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ฐ๋จํ ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํจ์ฌ ๋ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
f, err := os.Open("/dev/stdout")
throw err
์ด๊ฒ์ ์ถ๊ฐ ์ฝ๋ ํ์ ์ถ๊ฐํ์ง๋ง ๋ด๊ฐ ์ ๊ธฐํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ try
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด "๋์ฒด" ํจ์ ์๋ช
๊ฒฐํจ์ ์ ๊ฑฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
edit1 : defer
๋ฐ go
์ ์์ธ์ ๋ํด ์ฐธ๊ณ ํ์ธ์. ๋นํธ์ธ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์๋๊ธฐ ๋๋ฌธ์
๋๋ค try
๊ธฐ๋ฅ์ ๊ฒฐ๊ณผ๊ฐ ์๋ค๊ณ ๋งํ์ต๋๋ค.
@nathanjsweet ๋น์ ์ด ์ฐพ๋ ์ ์์ #32611์ ๋๋ค :-)
@nathanjsweet ๋ง์ํ์ ๋ด์ฉ ์ค ์ผ๋ถ๋ ์ฌ์ค์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด ์ธ์ด๋ append cap complex imag len make new real
๋ฏธ๋ฆฌ ์ ์ธ๋ ํจ์์ ํจ๊ป defer
๋๋ go
์ฌ์ฉ์ ํ์ฉํ์ง ์์ต๋๋ค. ๋ํ ์ฌ์ ์ ์ ํจ์ unsafe.Alignof unsafe.Offsetof unsafe.Sizeof
$ ์ ํจ๊ป defer
๋๋ go
๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
๊ด๋ฒ์ํ ์๊ฒฌ์ ๋ณด๋ด ์ฃผ์ @nathanjsweet ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. @ianlancetaylor ๋ ์ด๋ฏธ ๊ทํ์ ์ฃผ์ฅ์ด ๊ธฐ์ ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด์ง ์๋ค๊ณ ์ง์ ํ์ต๋๋ค. ์กฐ๊ธ ํ์ฅํด ๋ณด๊ฒ ์ต๋๋ค.
1) go
๋ฐ defer
๊ฐ ์๋ try
์ ํ์ฉํ์ง ์๋ ์ฌ์ ๋ถ๋ถ์ด ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. try
๊ฐ ์ฒซ ๋ฒ์งธ ๋ด์ฅ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ธ ๊ณณ. ์ด๊ฒ์ ์ ํํ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ด๋ฏธ defer append(a, 1)
๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ๋ค์ ๋ฐ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ๋ค๋ฅธ ๋นํธ์ธ์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด ์ ํ ์ฌํญ์ ํด๋น ๋ฌธ์ ์ ๋ํด try
์๋ ์ ์ฉ๋ฉ๋๋ค( try
๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋ ๊ฒฝ์ฐ ์ ์ธ). (๋์์ธ ๋ฌธ์์์ ์ด๋ฌํ ์ ํ ์ฌํญ์ ์ธ๊ธํ ์ด์ ๋ ๊ฐ๋ฅํ ํ ์ฒ ์ ํ๊ธฐ ์ํจ์
๋๋ค. ์ค์ ๋ก๋ ์ค์ ๋ก ๊ด๋ จ์ด ์์ต๋๋ค. ๋ํ ๋์์ธ ๋ฌธ์๋ฅผ ์ ํํ๊ฒ ์ฝ์ผ๋ฉด try
์ ๋ง๋ค ์ ์๋ค๊ณ ๋งํ์ง ์์ต๋๋ค. go
๋๋ defer
try
ํจ๊ป ์๋ํฉ๋๋ค. - ์ด๋ ๋จ์ํ ์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ํ์ฉํ์ง ์์์ ์์ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ค์ฉ์ ์ธ ์กฐ์น์
๋๋ค. ์ด๋ "ํฐ ์์ฒญ"์
๋๋ค. go
๋ฐ defer
์ ํจ๊ป ์๋ํฉ๋๋ค.)
2) ์ด๋ค ์ฌ๋๋ค์ try
์ด "๋ฏธํ์ ์ผ๋ก ์ญ๊ฒน๋ค"๋ ๊ฒ์ ๊ทธ๊ฒ์ด ๊ธฐ์ ์ ์ผ๋ก ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์ ์ํ ๋ค์ ์๋ช
์ ๋ํ ํน๋ณํ ๊ท์น์ ์ง์คํฉ๋๋ค. new
, make
, append
, unsafe.Offsetof
๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋ชจ๋ ์ผ๋ฐ Go ํจ์๋ก ํํํ ์ ์๋ ํน์ ๊ท์น์ด ์์ต๋๋ค. try
์ ๋ํ ์ธ์์ ํ์ํ ์ธ์(๊ตฌ์กฐ ํ๋์ฌ์ผ ํฉ๋๋ค!)์ ๋ํ ๊ตฌ๋ฌธ ์๊ตฌ์ฌํญ์ ์ข
๋ฅ๊ฐ ์ ํํ ์๋ unsafe.Offsetof
๋ฅผ ๋ณด์ญ์์ค(๋จ์ผ ๊ฐ ์ ํ์ด์ด์ผ ํฉ๋๋ค. error
๋๋ error
๋ฅผ ๋ง์ง๋ง ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ ํจ์ ํธ์ถ). ์ฐ๋ฆฌ๋ ์ฌ์์์ ์ด๋ฌํ ์๋ช
์ ๊ณต์์ ์ผ๋ก ํํํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๋ด์ฅ ๊ธฐ๋ฅ ์ค ์ด๋ ๊ฒ๋ ๊ธฐ์กด ํ์์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋ด์ฅ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ๊ท์น์ ์ฐ๋ฌธ์ผ๋ก ํํํฉ๋๋ค. ๊ทธ๊ฒ์ด _์ด์ _ ์ค๊ณ์ ์ฒ์๋ถํฐ Go์์ ํ์ถ์ฉ ํด์น๊ฐ _์ธ_ ๋ด์ฅ๋ ๊ฒ์
๋๋ค. ๋ํ ๋์์ธ ๋ฌธ์๋ ์ด์ ๋ํด ๋งค์ฐ ๋ช
์์ ์
๋๋ค.
3) ์ ์์ try
๊ฐ ์ธ์(ํ๋ ์ด์)์ ํจ๊ป ํธ์ถ๋ ๋ ๋ฐ์ํ๋ ์ผ์ ๋ํด์๋ ์ค๋ช
ํฉ๋๋ค. ํ์ฉ๋์ง ์์ต๋๋ค. ๋์์ธ ๋ฌธ์๋ try
๊ฐ ๋ค์ด์ค๋ ์ธ์ ํํ์์ (ํ๋) ๋ฐ์๋ค์ธ๋ค๊ณ ๋ช
์์ ์ผ๋ก ๋ช
์ ํ๊ณ ์์ต๋๋ค.
4) "์ด ์ ์์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค"๋ผ๊ณ ๋งํ๊ณ ์์ต๋๋ค. Go๋ ๋ด์ฅ์ด ํ ์ ์๋ ๊ฒ๊ณผ ํ ์ ์๋ ๊ฒ์ ์ ํํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์์ ํ ์์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฌ ํด์.
@griesemer
๋ํ ๋์์ธ ๋ฌธ์๋ ์ด์ ๋ํด ๋งค์ฐ ๋ช ์์ ์ ๋๋ค.
์ด๊ฒ์ ์ง์ ํ ์ ์์ต๋๊น? ๋๋ ์ด๊ฒ์ ์ฝ๊ณ ๋๋๋ค.
๋น์ ์ "์ด ์ ์์ ๋ด์ฅ ํจ์์ ์๋ฏธ๋ก ์ ์๋ฏธ๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค"๋ผ๊ณ ๋งํ๊ณ ์์ต๋๋ค. Go๋ ๋ด์ฅ์ด ํ ์ ์๋ ๊ฒ๊ณผ ํ ์ ์๋ ๊ฒ์ ์ ํํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์์ ํ ์์ ๊ฐ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ ๋นํ ์ง์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ๋์์ธ ๋ฌธ์์ ์ค๋ช
๋ ๋ด์ฉ๊ณผ "๊ฐ๊ธฐ" ๊ฐ์ ๋๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(Rob Pike๊ฐ ๋ง์ด ์ด์ผ๊ธฐํ๋ ๋ด์ฉ์
๋๋ค). ๋๋ try
์ ์์ด ๋ด์ฅ ํจ์๊ฐ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๊ธฐ๋ฅ์ ๊ท์น์ ์ด๊ธฐ๋ ๋ฐฉ์์ ํ์ฅํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ๊ณต์ ํ๋ค๊ณ ์๊ฐํ๋ฉฐ, ์ด๊ฒ์ด ๋ค๋ฅธ ๋ด์ฅ ํจ์์ ํ์ํ ์ด์ ๋ฅผ ์ดํดํ๋ค๋ ๊ฒ์ ์ธ์ ํ์ต๋๋ค. , ํ์ง๋ง ์ด ๊ฒฝ์ฐ ๊ท์น ์๋ฐ์ ํ์ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
panic
๋ฐ os.Exit
).unsafe.Offsetof
์ ์๋ฅผ ๋ค์์ต๋๋ค. , ์ด ๊ฒฝ์ฐ ๊ทํ๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์
๋๋ค. unsafe.Offsetof
์๋ ํ๋์ ์ธ์๊ฐ ํ์ํ ๋ฐ๋ฉด try
์๋ ๋ค๋ฅธ ๋ชจ๋ ์ปจํ
์คํธ์์ ํจ์์์ ๋ฐํ๋ ๊ฐ(์: try(os.Open("/dev/stdout"))
)์ฒ๋ผ ๋ณด์ด๊ณ ์์ ํ๊ฒ ๊ฐ์ ํ ์ ์๋ ํํ์์ด ํ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ปจํ
์คํธ์์๋ ํ๋์ ๊ฐ๋ง ๋ฐํํฉ๋๋ค(ํํ์์ด try(os.Open("/dev/stdout")...)
์ฒ๋ผ ๋ณด์ด์ง ์๋ ๊ฒฝ์ฐ).@nathanjsweet ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ํ ๋์์ธ ๋ฌธ์๋ ์ด์ ๋ํด ๋งค์ฐ ๋ช ์์ ์ ๋๋ค.
์ด๊ฒ์ ์ง์ ํ ์ ์์ต๋๊น? ๋๋ ์ด๊ฒ์ ์ฝ๊ณ ๋๋๋ค.
์ ์์์ "๊ฒฐ๋ก " ์น์ ์ ์์ต๋๋ค.
Go์์ ๋ด์ฅ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๋ถ๊ท์นํ์ง๋ง ํน์ ๊ตฌ๋ฌธ์ ์ ๋นํํ์ง ์๋ ์์ ์ ๋ํด ์ ํํ๋ ์ธ์ด ์ด์ค์ผ์ดํ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ๋์น ๊ฒ์ ๋๋์ต๋๋ค ;-)
@ngrilly ์ด ์ ์์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ go ์ธ์ด ์ฌ์์ ์๋ฏธํฉ๋๋ค. @griesemer ๊ฐ go ์ธ์ด ์ฌ์์ด ๋ด์ฅ ํจ์๋ฅผ ๊ตฌ๋ฌธ ๊ท์น์ ๊นจ๋ ๋ฐ ํนํ ์ ์ฉํ ๋ฉ์ปค๋์ฆ์ผ๋ก ํธ์ถํ๋ค๊ณ ๋งํ๊ณ ์๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
@nathanjsweet
์ด๋ค ๋ฉด์์๋ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ ์คํ์ ํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ ์ด ํ๋ฆ ๋ ผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฒซ ๋ฒ์งธ ํจ์์ ๋๋ค(panic ๋ฐ os.Exit ์ฒ๋ผ)
os.Exit
๊ฐ ์ ์ฉํ ์๋ฏธ์์ ์คํ์ ํด์ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ง์ฐ๋ ํจ์๋ฅผ ์คํํ์ง ์๊ณ ์ฆ์ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค. panic
์ try
๋ชจ๋ ์ง์ฐ๋ ํจ์๋ฅผ ์คํํ๊ณ ์คํ ์๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ os.Exit
๊ฐ ์ด์ํ ๊ฒ ๊ฐ์ต๋๋ค.
os.Exit
๊ฐ ์ด์ํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํ์ง๋ง ๊ทธ๋ ๊ฒ ๋์ด์ผ ํฉ๋๋ค. os.Exit
๋ ๋ชจ๋ ๊ณ ๋ฃจํด์ ์ค์งํฉ๋๋ค. os.Exit
๋ฅผ ํธ์ถํ๋ ๊ณ ๋ฃจํด์ ์ง์ฐ๋ ๊ธฐ๋ฅ๋ง ์คํํ๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์์ต๋๋ค. ๋ชจ๋ ์ง์ฐ๋ ๊ธฐ๋ฅ์ ์คํํ๊ฑฐ๋ ์คํํ์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌด๊ฒ๋ ์คํํ์ง ์๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์์ tryhard
๋ฅผ ์คํํ๊ณ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ป์ ๊ฒ์
๋๋ค:
--- stats ---
15298 (100.0% of 15298) func declarations
3026 ( 19.8% of 15298) func declarations returning an error
33941 (100.0% of 33941) statements
7765 ( 22.9% of 33941) if statements
3747 ( 48.3% of 7765) if <err> != nil statements
131 ( 3.5% of 3747) <err> name is different from "err"
1847 ( 49.3% of 3747) return ..., <err> blocks in if <err> != nil statements
1900 ( 50.7% of 3747) complex error handler in if <err> != nil statements; cannot use try
19 ( 0.5% of 3747) non-empty else blocks in if <err> != nil statements; cannot use try
1789 ( 47.7% of 3747) try candidates
๋จผ์ Go(1.13 ์ด์ )์๋ ์ค๋ฅ ์ปจํ
์คํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ error
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์์ฒด ์ค๋ฅ ์ ํ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ํจ์๋ $ ๋์ error
foo.Error
๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ์ ์ธ๋๋ค๋ ์ ์ ๋ถ๋ช
ํ ํ๊ณ ์ถ์ต๋๋ค. error
, ์ด ๋ถ์๊ธฐ๊ฐ ์ด๋ฅผ ํฌ์ฐฉํ์ง ๋ชปํ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ด ๊ฒฐ๊ณผ๊ฐ "๊ณต์ "ํ์ง ์์ต๋๋ค.
'๋ค! ํด๋ณด์'๋ผ๋ ์ง์์ ์์๊ณ , 1.13์ด๋ 1.14 ๋ฒ ํ ์ ํฅ๋ฏธ๋ก์ด ์คํ์ด ๋ ๊ฒ ๊ฐ์๋ฐ _" 47.7% ... ํ๋ณด๋ฅผ ์๋ํด๋ณด์ธ์."_. ๊ทธ๊ฒ์ ์ด์ ๋ด๊ฐ ์ข์ํ์ง ์๋ ์ผ์ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฌ์ธํฐ๋ฅผ ๋ง๋๋ 2๊ฐ์ง ๋ฐฉ๋ฒ( new(Foo)
vs &Foo{}
)๊ณผ make([]Foo)
๋ฐ []Foo{}
๋ก ์ฌ๋ผ์ด์ค ๋๋ ๋งต์ ๋ง๋๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. .
์ด์ ์ ๋ "์ด๊ฒ์ _์๋_ ํด๋ด
์๋ค."์ ์บ ํ์ ์์ต๋๋ค.^) ์ปค๋ฎค๋ํฐ๊ฐ ์ด๋ป๊ฒ ์๊ฐํ๋์ง ํ์ธํฉ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์ฝ๋ฉ ํจํด์ ๊ฒ์ผ๋ฅด๊ฒ ๋ณ๊ฒฝํ๊ณ ์ปจํ
์คํธ ์ถ๊ฐ๋ฅผ ์ค๋จํ ๊ฒ์ด์ง๋ง, ์ด์จ๋ ์ค๋ xerrors
impl์์ ์ค๋ฅ๊ฐ ๋ ๋์ ์ปจํ
์คํธ๋ฅผ ์ป๋๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
๋ ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด ์ฃผ์ @Goodwine๋ , ๊ฐ์ฌํฉ๋๋ค!
(์ฌ๋ด์ผ๋ก ์ ๋ ์ด์ ฏ๋ฐค์ tryhard
๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ฌ "๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ" ์๋ฅผ ๋ณต์กํ ์ฒ๋ฆฌ๊ธฐ์ return ..., expr
ํ์์ ๋ฐํ์ ๋ ๊ฐ์ง ๊ฐ์๋ก ๋ถํ ํฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฐ์ <err>
๊ฐ ์๋๋๋ค. ์ด๊ฒ์ ์ถ๊ฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.)
์ด ์ด์ํ ํํ ์ธ์ ๋์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์์ ์์ ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
๊ทธ๋ฌ๋ฉด ๋ง์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ค๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋๋ ์ ์ผํ ๊ฒ์ ๋ช
์์ ๊ฐ๋ณ ...
์
๋๋ค. ์:
try(os.Open("/dev/stdout")...)
๊ทธ๋ฌ๋ ๋ณด๋ค ์ ์ฐํ ์ํฉ์ ์ํ๋ ์ฌ๋๋ค์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
f, err := os.Open("/dev/stdout")
try(WrapErrorf(err, "whatever wrap does: %v"))
์ด ์์ด๋์ด๊ฐ ํ๋ ํ ๊ฐ์ง๋ try
๋ผ๋ ๋จ์ด๋ฅผ ๋ ์ ์ ํ๊ฒ ๋ง๋๋ ๊ฒ์ด์ง๋ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํฉ๋๋ค.
@nathanjsweet ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด ์ ์์์ ๋งํ๋ ๊ฒ์ด ์๋๋ผ go ์ธ์ด ์ฌ์์์ ๋งํ๋ ๊ฒ์ ๋๋ค.
๋ค์์ ์ธ์ด ์ฌ์์์ ์ฐพ๊ณ ์๋ ์ถ์ถ์ ๋๋ค.
"ํํ์ ๋ฌธ" ์น์ ์์:
๋ค์ ๋ด์ฅ ํจ์๋ ๋ช ๋ น๋ฌธ ์ปจํ ์คํธ์์ ํ์ฉ๋์ง ์์ต๋๋ค.
append cap complex imag len make new real unsafe.Alignof unsafe.Offsetof unsafe.Sizeof
"Go ๋ฌธ" ๋ฐ "Defer statements" ์น์ ์์:
๋ด์ฅ ํจ์์ ํธ์ถ์ ํํ์ ๋ฌธ๊ณผ ๊ฐ์ด ์ ํ๋ฉ๋๋ค.
"๋ด์ฅ ๊ธฐ๋ฅ" ์น์ ์์:
๋ด์ฅ ํจ์์๋ ํ์ค Go ์ ํ์ด ์์ผ๋ฏ๋ก ํธ์ถ ํํ์์๋ง ๋ํ๋ ์ ์์ต๋๋ค. ํจ์ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@nathanjsweet ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@griesemer ๊ฐ go ์ธ์ด ์ฌ์์ด ๋ด์ฅ ํจ์๋ฅผ ๊ตฌ๋ฌธ ๊ท์น์ ๊นจ๋ ๋ฐ ํนํ ์ ์ฉํ ๋ฉ์ปค๋์ฆ์ผ๋ก ํธ์ถํ๋ค๊ณ ๋งํ๊ณ ์๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
๋ด์ฅ ํจ์๋ Go ๊ตฌ๋ฌธ ๊ท์น(๊ดํธ, ์ธ์ ์ฌ์ด์ ์ผํ ๋ฑ)์ ์๋ฐํ์ง ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ํจ์์ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ง ์ฌ์ฉ์ ์ ์ ํจ์์์ ์ํํ ์ ์๋ ์์ ์ ํ์ฉํฉ๋๋ค.
@nathanjsweet ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ณ ๋ ค๋์์ง๋ง(์ฌ์ค์ ์ค์์์ต๋๋ค) try
๋ฅผ ํ์ฅํ ์ ์๊ฒ ๋ง๋ญ๋๋ค. https://go-review.googlesource.com/c/proposal/+/181878 ์ ์ฐธ์กฐํ์ธ์.
๋ ์ผ๋ฐ์ ์ผ๋ก, ๋๋ ๋น์ ์ด ์๋ชป๋ ๊ฒ์ ๋นํ์ ์ง์คํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. try
์ธ์์ ๋ํ ํน๋ณ ๊ท์น์ ์ค์ ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๊ฑฐ์ ๋ชจ๋ ๋ด์ฅ ๊ธฐ๋ฅ์๋ ํน๋ณํ ๊ท์น์ด ์์ต๋๋ค.
@griesemer ์ด ์์ ์ ์ํํ๊ณ ์ปค๋ฎค๋ํฐ ๋ฌธ์ ์ ์๋ตํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ด ์์ ์์ ๊ฐ์ ์ง๋ฌธ์ ๋ง์ ๋๋ต์ ํ๋ค๊ณ ํ์ ํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ ๋ง ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ฐ์ฌ ํด์!
@nathanjsweet ์ฌ๊ธฐ ์ ๊ทํ์ ์๊ฒฌ์ ๋ํด :
Go์์ ๋ด์ฅ์ ์ญํ ์ ๋ํด ๋๋๋ฌ์ง๊ฒ ์ด์ผ๊ธฐํ๋ ๊ฒฐ๋ก ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
try
๋ด์ฅ ๊ธฐ๋ฅ์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํ์ฅํ๋ ๊ฒ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋ํด: ์, unsafe.Offsetof
๊ฐ ์ธ์์ ๋ฃ๋ ์๊ตฌ ์ฌํญ์ $#$2 try
#$ ์ ์๊ตฌ ์ฌํญ๊ณผ ๋ค๋ฆ
๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ค ๊ตฌ๋ฌธ์ ์ผ๋ก ํํ์ ๊ธฐ๋ํฉ๋๋ค. ๋ ๋ค ํด๋น ํํ์์ ๋ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. try
์ ๋ํ ์๊ตฌ ์ฌํญ์ ํ๋ฐํธ ์๋ ๊ตฌ๋ฌธ ๋ถ์ ๋๊ตฌ๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์์ ์ ๋๋ก Go์ ๊ตฌ๋ฌธ์ ์ฝ๊ฒ ๋ง์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์๊ฒ ์ด์ํ๋ค๊ณ ๋๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง ๊ทธ๊ฒ์ด ๊ทธ๊ฒ์ ๋ํ ๊ธฐ์ ์ ์ด์ ์ ๋์ผํ์ง ์์ต๋๋ค.
@griesemer ์ต์ _tryhard_๋ "๋ณต์กํ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ"๋ฅผ ๊ณ์ฐํ์ง๋ง "๋จ์ผ ๋ช ๋ น๋ฌธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ"๋ ๊ณ์ฐํ์ง ์์ต๋๋ค. ์ถ๊ฐ๋ ์ ์์๊น์?
@networkimprov ๋จ์ผ ๋ช
๋ น๋ฌธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ ๋ฌด์์
๋๊น? ๋จ์ผ non-return ๋ฌธ์ ํฌํจํ๋ if
๋ธ๋ก?
@griesemer , ๋จ์ผ ๋ช
๋ น๋ฌธ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ ๋ฐํ์ ํฌํจํ์ฌ _any_ ๋จ์ผ ๋ช
๋ น๋ฌธ์ ํฌํจํ๋ if err != nil
๋ธ๋ก์
๋๋ค.
@networkimprov ์๋ฃ. "๋ณต์กํ ํธ๋ค๋ฌ"๋ ์ด์ "๋จ์ผ ๋ฌธ ๋ค์ ๋ถ๊ธฐ"์ "๋ณต์กํ ๋ค์ ๋ถ๊ธฐ"๋ก ๋ถํ ๋ฉ๋๋ค.
์ฆ, ์ด๋ฌํ ์นด์ดํธ๋ ์คํด์ ์์ง๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฌํ ์นด์ดํธ์๋ nil์ ๋ํด ๋ชจ๋ ๋ณ์๋ฅผ ํ์ธํ๋ ๋ชจ๋ if
๋ฌธ์ด ํฌํจ๋ฉ๋๋ค(ํ์ฌ tryhard
์ ๊ธฐ๋ณธ๊ฐ์ธ -err=""
์ธ ๊ฒฝ์ฐ). tryhard
). ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด์ tryhard
๋ ๋ณต์กํ๊ฑฐ๋ ๋จ์ผ ๋ช
๋ น๋ฌธ ์ฒ๋ฆฌ๊ธฐ ๊ธฐํ์ ์๋ฅผ ๋ง์ด ๊ณผ๋ํ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด archive/tar/common.go
, 701ํ์ ์ฐธ์กฐํ์ญ์์ค.
@networkimprov tryhard
๋ ์ด์ ์ค๋ฅ ๊ฒ์ฌ๊ฐ try
ํ๋ณด๊ฐ ์๋ ์ด์ ์ ๋ํ ๋ณด๋ค ์ ํํ ์นด์ดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. try
์นด์ดํธ์ ์ ์ฒด ์๋ ๋ณ๊ฒฝ๋์ง ์์์ง๋ง ๋ ๋ง์ ๋จ์ผ ๋ฐ ๋ณต์กํ ํธ๋ค๋ฌ์ ๋ํ ๊ธฐํ ์๋ ์ด์ ๋ ์ ํํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ณต์กํ then
์ ์ if
๋ฌธ์ ๋ถ๊ธฐ๋ if
์ <varname> != nil
๊ฒ์ฌ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํฌํจ๋๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๊ฐ์ฃผ๋ฉ๋๋ค.
๋๊ตฌ๋ ์ง try
๋ฅผ ์กฐ๊ธ ๋ ์์ผ๋ก ์ํํด๋ณด๊ณ ์ถ๋ค๋ฉด ํ๋กํ ํ์
๊ตฌํ์ผ๋ก ์ฌ๊ธฐ์ WASM ํ๋ ์ด๊ทธ๋ผ์ด๋๋ฅผ ๋ง๋ค์์ต๋๋ค.
https://ccbrown.github.io/wasm-go-playground/experimental/try-builtin/
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก try๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์๋ค๋ฉด ์ฌ๊ธฐ์์ ์๋ฒฝํ๊ฒ ์๋ํ๋ ์ต์ ๊ตฌํ์ด๋ผ๊ณ ์๊ฐํ๋ Go ํฌํฌ๊ฐ ์์ต๋๋ค. https://github.com/ccbrown/go/pull/1
๋๋ '์๋'๋ฅผ ์ข์ํ๋ค. ๋๋ err์ ๋ก์ปฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ด๋ จ ๊ฐ์ ธ์ค๊ธฐ์ ํจ๊ป err๊ณผ ํจ๊ป := vs =๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธฐ์ ์ธ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ํ, ๋๋ ์ด๊ฒ์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ๊ฐ์ด ๋์ผํ ์ผ์ ์ํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ง๋๋ ๊ฒ์ผ๋ก ๋ณด์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฒ์ฑ ๋ฐ์ถ.
1๋
์ ์ ์์
ํ ์๊ท๋ชจ ๋ด๋ถ ํ๋ก์ ํธ์ ๋ํด tryhard
๋ฅผ ์คํํ์ต๋๋ค. ๋ฌธ์ ์ ๋๋ ํ ๋ฆฌ์๋ 3๊ฐ์ ์๋ฒ("๋ง์ดํฌ๋ก์๋น์ค"๋ผ๊ณ ๊ฐ์ )์ ๋ํ ์ฝ๋, cron ์์
์ผ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋ ํฌ๋กค๋ฌ ๋ฐ ๋ช ๊ฐ์ง ๋ช
๋ น์ค ๋๊ตฌ๊ฐ ์์ต๋๋ค. ๋ํ ์๋นํ ํฌ๊ด์ ์ธ ๋จ์ ํ
์คํธ๊ฐ ์์ต๋๋ค. (FWIW, ๋ค์ํ ๋ถ๋ถ์ด 1๋
๋๊ฒ ์์กฐ๋กญ๊ฒ ์คํ๋์์ผ๋ฉฐ, ๋ฐ์ํ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊ทธํ๊ณ ํด๊ฒฐํ๋ ๊ฒ์ด ๊ฐ๋จํ๋ค๋ ๊ฒ์ด ์
์ฆ๋์์ต๋๋ค.)
ํต๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
--- stats ---
370 (100.0% of 370) func declarations
115 ( 31.1% of 370) func declarations returning an error
1159 (100.0% of 1159) statements
258 ( 22.3% of 1159) if statements
123 ( 47.7% of 258) if <err> != nil statements
64 ( 52.0% of 123) try candidates
0 ( 0.0% of 123) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
54 ( 43.9% of 123) { return ... zero values ..., expr }
2 ( 1.6% of 123) single statement then branch
3 ( 2.4% of 123) complex then branch; cannot use try
1 ( 0.8% of 123) non-empty else branch; cannot use try
์ผ๋ถ ๋
ผํ:
1) ์ด ์ฝ๋๋ฒ ์ด์ค์ ์๋ ๋ชจ๋ if
๋ฌธ์ 50%๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ์์๊ณ try
๋ ๊ทธ ์ค ~์ ๋ฐ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด (์์) ์ฝ๋๋ฒ ์ด์ค์ ์๋ ๋ชจ๋ if
๋ฌธ์ 4๋ถ์ 1์ด try
์ ํ์ํ๋ ๋ฒ์ ์์ ์๋ฏธํฉ๋๋ค.
status.Annotate
) ์ด ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ๋ช ์ฃผ ์ ์ ์ฐ์ฐํ ์ค๋ฅ ๋ฉ์์ง์ ์ฃผ์์ ์ถ๊ฐํ์ง๋ง gRPC ์ํ ์ฝ๋. ์๋ฅผ ๋ค์ด, RPC๋ฅผ ํธ์ถํ๊ณ ๊ด๋ จ ์ํ ์ฝ๋๊ฐ PERMISSION_DENIED์ธ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ์ด ๋์ฐ๋ฏธ ํจ์์์ ๋ฐํ๋ ์ค๋ฅ๋ ์ฌ์ ํ PERMISSION_DENIED์ ๊ด๋ จ ์ํ ์ฝ๋๋ฅผ ๊ฐ์ง๋๋ค. RPC ํธ๋ค๋ฌ๊น์ง ์ฐ๊ฒฐ๋๋ฉด RPC๋ ์ฐ๊ฒฐ๋ ์ํ ์ฝ๋์ ํจ๊ป ์คํจํฉ๋๋ค. ๋๋ ์ด ์ ํ๋ก์ ํธ์ ๋ชจ๋ ๊ฒ์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ช
ํ ๋ชจ๋ ์ค๋ฅ์ 50%์ ๋ํด ์ฃผ์ ์์ด ์ค๋ฅ๋ฅผ ์ ํํ์ต๋๋ค. ( tryhard
๋ฅผ ์คํํ๊ธฐ ์ ์ 10%๋ฅผ ์์ธกํ์ต๋๋ค).
3) status.Annotate
๋ nil
์ค๋ฅ๋ฅผ ์ ์งํ๊ธฐ ์ํด ๋ฐ์ํฉ๋๋ค(์: status.Annotatef(err, "some message: %v", x)
๋ nil
iff err == nil
$ ๋ฅผ ๋ฐํํฉ๋๋ค). ๋๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ฃผ์ ์๋ํ์ง ์์ ๋ชจ๋ ํ๋ณด์๋ฅผ ์ดํด๋ณด์๊ณ ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
```
// Before
enc, err := keymaster.NewEncrypter(encKeyring)
if err != nil {
return status.Annotate(err, "failed to create encrypter")
}
// After
enc, err := keymaster.NewEncrypter(encKeyring)
try(status.Annotate(err, "failed to create encrypter"))
```
To be clear, I'm not saying this transformation is always necessarily a good idea, but it seemed worth mentioning since it boosts the count significantly to a bit under half of all `if` statements.
4) defer
๊ธฐ๋ฐ ์ค๋ฅ ์ฃผ์์ $# try
๊ฐ ์๊ฑฐ๋ ์์ด ์๋ํ๊ธฐ ๋๋ฌธ์ ์์งํ ๋งํด์ try
์ ๋ค์ ์ง๊ตํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ ์์๊ธฐ ๋๋ฌธ์ ํธ์ถ ์์ ์๊ฐ ์์ฑํ ์ค๋ฅ๊ฐ ๋ ์ดํด๊ฐ ๋๋ ๋ช ๊ฐ์ง ์ฌ๋ก๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด gRPC ํด๋ผ์ด์ธํธ๋ฅผ ํธ์ถํ๋ ์ฌ๋ฌ ์ฝ๋ ์ธ์คํด์ค๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
```
resp, err := s.someClient.SomeMethod(ctx, req)
if err != nil {
return ..., status.Annotate(err, "failed to call SomeMethod")
}
```
This is actually a bit redundant in retrospect, since gRPC already prefixes its errors with something like "/Service.Method to [ip]:port : ".
There was also code that called standard library functions using the same pattern:
```
hreq, err := http.NewRequest("GET", targetURL, nil)
if err != nil {
return status.Annotate(err, "http.NewRequest failed")
}
```
In retrospect, this code demonstrates two issues: first, `http.NewRequest` isn't calling a gRPC API, so using `status.Annotate` was unnecessary, and second, assuming the standard library also return errors with callee context, this particular use of error annotation was unnecessary (although I am fairly certain the standard library does not consistently follow this pattern).
์ด์จ๋ ์ด ํ๋ก์ ํธ๋ก ๋์์์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฃผ์ ๊น๊ฒ ์ดํด๋ณด๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ด ์ฐ์ต์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
ํ ๊ฐ์ง, @griesemer : tryhard
์ "๋น ์๋ ํ๋ณด์"์ ๋ํ ์ฌ๋ฐ๋ฅธ ๋ถ๋ชจ๊ฐ ์์ต๋๊น?
ํธ์ง : ์๋์ ๋ต๋ณํ์ต๋๋ค. ํต๊ณ๋ฅผ ์๋ชป ์ฝ์์ต๋๋ค.
ํธ์ง: ํผ๋๋ฐฑ์ด ์ ์์ผ๋ก ๋์ด๊ฐ์ด์ผ ํ๋ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ํ์ง ๋ง ๊ฒ์ ๋ช ์์ ์ผ๋ก ์์ฒญ๋ฐ์์ต๋๋ค. ๋ด ์๊ฒฌ์ ์์ง ๋ก ์ฎ๊ฒผ์ต๋๋ค.
@balasanjay ์ฌ์ค์ ๊ธฐ๋ฐํ ์๊ฒฌ์ ๋ณด๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋งค์ฐ ๋์์ด ๋ฉ๋๋ค.
tryhard
์ ๋ํ ๊ทํ์ ์ง๋ฌธ๊ณผ ๊ด๋ จํ์ฌ: "๋น์๋ ํ๋ณด์"(๋ ๋์ ์ ๋ชฉ ์ ์ ํ์)๋ ๋จ์ํ if
๋ฌธ์ด "์ค๋ฅ ๊ฒ์ฌ"(์: , ์ค๋ฅ ๋ณ์ <err>
์ ๋ํ ํ ๋น์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด ์์๊ณ ์์ค์์ if <err> != nil
ํ์ธ์ด ๋ค๋ฐ๋์ง๋ง try
๋ก ์ธํด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ if
๋ธ๋ก์ ์ฝ๋์
๋๋ค. ํนํ "๋น ์๋ ํ๋ณด" ์ถ๋ ฅ์ ๋ํ๋๋ ์์๋๋ก $ <err>
๊ฐ ์๋ ๋ค๋ฅธ ๊ฒ์ ๋ฐํํ๋ return
if
์
๋๋ค. ํ๋์ ๋ ๋ณต์กํ return
(๋๋ ๊ธฐํ) ๋ฌธ์ด ์๋ $# if
9$#$ ๋ฌธ, "then" ๋ถ๊ธฐ์ ์ฌ๋ฌ ๋ฌธ์ด ์๋ if
๋ฌธ, ๋ค์์ด ํฌํจ๋ if
๋ฌธ ๋น์ด ์์ง ์์ else
๋ถ๊ธฐ. ์ด๋ฌํ if
๋ฌธ ์ค ์ผ๋ถ๋ ์ด๋ฌํ ์กฐ๊ฑด ์ค ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ์ถฉ์กฑํ ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ์ซ์๋ ํฉ์ฐ๋์ง ์์ต๋๋ค. try
๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐ ๋ฌด์์ด ์๋ชป๋์๋์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๊ฒ์
๋๋ค.
์ค๋ ๊ฐ์ฅ ์ต๊ทผ์ ์กฐ์ ํ์ต๋๋ค(์ต์ ๋ฒ์ ์ ์คํํ์ต๋๋ค). ๋ง์ง๋ง ๋ณ๊ฒฝ ์ด์ ์๋ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ์๋ ๊ณ์ฐ๋๋ ์ด๋ฌํ ์กฐ๊ฑด ์ค ์ผ๋ถ๊ฐ try
์ฒ๋ผ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก try
์ผ ๋ ๋ ๋ง์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฃผ์ด์ง ์ฝ๋๋ฒ ์ด์ค์ ๋ํด try
์ ๋ํ ๊ด๋ จ ์กฐ๊ฑด์ด ๋์ผํ๊ฒ ์ ์ง๋์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฐ์ ์ผ๋ก try
ํ๋ณด์ ์ ์ฒด ์๋ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
์ธก์ ๋ฐฉ๋ฒ ๋ฐ/๋๋ ๋์์ ๋ํ ๋ ๋์ ์ ์์ด ์๋ค๋ฉด ๊ธฐ๊บผ์ด ๋ฃ๊ฒ ์ต๋๋ค. ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ช ๊ฐ์ง ์กฐ์ ์ ํ์ต๋๋ค. ๊ฐ์ฌ ํด์.
@subfuzion ๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋์ฒด ์ ์์ ์ฐพ๊ณ ์์ง ์์ต๋๋ค. https://github.com/golang/go/issues/32437#issuecomment -501878888 ์ ์ฐธ์กฐํ์ธ์. ๊ฐ์ฌ ํด์.
๊ฒฐ๊ณผ์ ๊ด๊ณ์์ด ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ:
์ ๋ ์ฐ๋ฆฌ ํ๊ณผ ํจ๊ป Rob์ด ์ ์ํ try
ํ๋ ์์ํฌ๊ฐ ํฉ๋ฆฌ์ ์ด๊ณ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ง๋ง ๊ธฐ๋ณธ ์ ๊ณต์ผ๋ก ์ ์ ํ ์์ค์๋ ๋๋ฌํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง๋ ์ฌ์ฉ ํจํด์ด ์ค์ ๋ก ํ๋ฆฝ๋ ๋๊น์ง ํจ์ฌ ๋ ์ ์ ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ ๊ฒ์
๋๋ค. try
๊ฐ ๊ทธ๋ฐ ์์ผ๋ก ์ธ์ด์ ๋ค์ด์จ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ณณ์์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
์ข ๋ ์ผ๋ฐ์ ์ผ๋ก ๋งํ์๋ฉด, Go์ ๋งค์ฐ ์์ ์ ์ธ ํต์ฌ ์ธ์ด์ ๋งค์ฐ ํ๋ถํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กฐํฉ์ ๋ณด์กดํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ธ์ด ํ์ด ํต์ฌ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ์๋๋ ๋๋ฆด์๋ก ์ข์ต๋๋ค. x -> stdlib
ํ์ดํ๋ผ์ธ์ ์ด๋ฌํ ์ข
๋ฅ์ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋จ์ ์์ต๋๋ค.
@griesemer ์ ์ฃ์กํฉ๋๋ค. ํต๊ณ๋ฅผ ์๋ชป ์ฝ์์ต๋๋ค. "if err != nil statements" ์นด์ดํฐ(123)๋ฅผ ๋ถ๋ชจ๋ก ์ฌ์ฉํ๊ณ "try ํ๋ณด์" ์นด์ดํฐ(64)๋ฅผ ๋ถ๋ชจ๋ก ์ฌ์ฉํ์ง ์๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ ์ง๋ฌธ์ ๋์ง ๊ฒ์ด๋ค.
๊ฐ์ฌ ํด์!
@mattpalmer ์ฌ์ฉ ํจํด์ ์ฝ 10๋
๋์ ํ๋ฆฝ๋์์ต๋๋ค. try
์ ๋์์ธ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋ฐ๋ก ์ด๋ฌํ ์ ํํ ์ฌ์ฉ ํจํด์
๋๋ค. ์ด๋ค ์ฌ์ฉ ํจํด์ ๋งํ๋ ๊ฒ์
๋๊น?
@griesemer ์ฃ์กํฉ๋๋ค. ์ ์๋ชป์
๋๋ค try
์ ๋ํด ๋๋ฅผ ๊ท์ฐฎ๊ฒ ํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ธฐ ์์ํ ๊ฒ์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ ๋ํ ์ ์์ ์ ์ค๋ช
ํ๋ ์์ฒด ์ ์์ผ๋ก ์ด์ด์ก์ต๋๋ค. ๊ทธ๊ฒ์ ๋ถ๋ช
ํ ๋ช
์๋ ๊ธฐ๋ณธ ๊ท์น์ ์๋ฐฐ๋์์ต๋๋ค(์๋ก์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ๋ํ ์ด ์ ์๊ณผ ๋ฌ๋ฆฌ ์๋ก์ด ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ค๋ ๊ฒ์ ๋งํ ๊ฒ๋ ์์ต๋๋ค). ๋ํ๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด ๋๊ธ์ ์ญ์ ํ๋ ๊ฒ์ด ๋์์ด ๋ ๊น์(๋๋ ์๋ชป๋ ํ์์ผ๋ก ๊ฐ์ฃผ๋๋์)?
@subfuzion ๋๋ ๊ทธ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋ ์ ์์ด๊ณ ๋ง์ ์ ์์ด ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด์ํ๋ค
์ฐ๋ฆฌ๋ ํด๋น ๋์์ธ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๊ณ ๋ง์ ์ฌ๋๋ค์๊ฒ ํผ๋๋ฐฑ์ ์์ฒญํ ํ ๊ฒ์ํ๊ณ ์ค์ ์คํ ๋จ๊ณ๋ก ์งํํ ๊ฒ์ ๊ถ์ฅํ์ง๋ง ์์ง ์คํ์ ํ์ง ์์์ต๋๋ค. ์คํ์ด ์คํจํ๊ฑฐ๋ ํผ๋๋ฐฑ์์ ๋ถ๋ช ํ ์คํจํ ๊ฒ์ด๋ผ๊ณ ๋ฏธ๋ฆฌ ์๋ ค์ฃผ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ ๋จ๊ณ๋ก ๋์๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
@griesemer ํ์ด ์คํ์ ์ฑ๊ณต ๋๋ ์คํจ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉํ ํน์ ์งํ์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@iand
๋๋ ์ผ๋ง ์ ์ @rsc ์๊ฒ ์ด๊ฒ์ ๋ฌผ์์ต๋๋ค(https://github.com/golang/go/issues/32437#issuecomment-503245958):
@rsc
์ด๋ฌํ ํธ์๋ฅผ ์ ๊ณตํ ์ ์๋ ์์น๋ ๋ถ์กฑํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ์ธํ๊ณ ๋ฉ์ปค๋์ฆ์ ์ค์ฒด๋ฅผ ์ฆ๋ช ํ ์ด๋ค ์ฒ๋๊ฐ ์ถ๊ตฌ๋๊ณ ์์ต๋๊น? ๋ถ๋ฅ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฌ๋ก ๋ชฉ๋ก์ด ์์ต๋๊น? ๋ง์ ๊ณต๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ ์ํด ์ข์ฐ๋ ๋ ๋ฐ์ดํฐ์์ ๊ฐ์น๊ฐ ์ด๋ป๊ฒ ๋์ถ๋ ๊น์?
๋๋ต์ ๋ชฉ์ ์ด ์์์ง๋ง ๊ณ ๋ฌด์ ์ด์ง ์๊ณ ๋ด์ฉ์ด ๋ถ์กฑํ์ต๋๋ค(https://github.com/golang/go/issues/32437#issuecomment-503295558):
๊ฒฐ์ ์ ์ด๊ฒ์ด ์ค์ ํ๋ก๊ทธ๋จ์์ ์ผ๋ง๋ ์ ์๋ํ๋์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ฌ๋๋ค์ด ๋๋ถ๋ถ์ ์ฝ๋์์ ์๋๊ฐ ๋นํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค๋ฉด ๊ทธ๊ฒ์ ์ค์ํ ๋ฐ์ดํฐ์ ๋๋ค. ํ๋ก์ธ์ค๋ ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ฐ์ดํฐ์ ์ํด ์ฃผ๋๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๊ฐ์ ์ ์ํด ์ฃผ๋๋์ง ์์ต๋๋ค.
์ถ๊ฐ ๊ฐ์ ์ด ์ ๊ณต๋์์ต๋๋ค(https://github.com/golang/go/issues/32437#issuecomment-503408184).
try
๊ฐ ์ด์ ์ ๋ ผ์๋์ง ์์ ๋ฐฉ์์ผ๋ก ๋ถ๋ช ํ ๋ ๋์ ์ฝ๋๋ก ์ด์ด์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋๋์ต๋๋ค.
๊ฒฐ๊ตญ ๋๋ "๋ถ๋ฅ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฌ๋ก ๋ชฉ๋ก์ด ์์ต๋๊น?"๋ผ๋ ๋ด ์์ ์ ์ง๋ฌธ์ ๋๋ตํ์ต๋๋ค. ์๋ ์ง์ , ์๋ ํต๊ณผ, ์๋ ๊ฐ์ , ์๋ ์ง์ , ์๋ ํต๊ณผ, ์๋ ๊ฐ์ ์ 6๊ฐ์ง ์ค๋ฅ ์ฒ๋ฆฌ ๋ชจ๋๊ฐ ์์ต๋๋ค. ํ์ฌ๋ ์ด๋ฌํ ๋ชจ๋ ์ค 2๊ฐ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๊ทธ๋ค์ ์ด์ง์ ์๋นํ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๊ณ ์๋ ๊ฐ์ ๋ชจ๋๋ ๋๋ถ๋ถ์ ๋ฒ ํ ๋ ๊ณ ํผ์๊ฒ ๊ฐ๋ ฅํ๊ฒ ๊ธ์ง๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๊ทธ ์ฐ๋ ค๋ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋ฌด์๋๊ณ ์์ต๋๋ค. (https://github.com/golang/go/issues/32437#issuecomment-507332843).
๋ํ ๊ฒฐ๊ณผ์ ๊ฐ์น๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๋ณํ ์ ์ ์๋ํ๋ ๋ณํ์ ๊ฒํ ํ ๊ฒ์ ์ ์ํ์ต๋๋ค(https://github.com/golang/go/issues/32437#issuecomment-507497656). ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ณ ๋ง๊ฒ๋ ์ ๊ณต๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ ๋์ ํ๊ณ ์ ์ ๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด๊ฒ์ ์ฌ์ ํ โโ๋์ ํ๊ณ ์ผ์น๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์ ์ธ ๋ฐฉ๋ฒ์ ์ํฅ์ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๊ฒฐ๊ตญ(๋ด ์๊ฐ์) ์ฌ์ฉ์๊ฐ ์ ๋์ ์ผ๋ก ์ทจ๊ธ๋์ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋ฐ์๋ ๊ฒ์ผ๋ฅธ ๊ฒ์ผ๋ก ์ทจ๊ธ๋์ด์ผ ํฉ๋๋ค.
๊ฐ์น์๋ ํ๋ณด์๋ฅผ ๋์น๋ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ ์คํจ๋ ์ง์ ๋์์ต๋๋ค (https://github.com/golang/go/issues/32437#issuecomment-507505243).
๋๋ ์ด ๊ณผ์ ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถ์กฑํ๊ณ ํนํ ์๋ฆฌ๊ฐ ๋ค๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ ๋ํด ์๋๋ฝ๊ฒ ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@iand @rsc ๊ฐ ์ ๊ณตํ ๋ต๋ณ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. ๋๋ ๊ทธ ๋๋ต์ ์ด๋ ๋ถ๋ถ์ด "์ค์ง ๋ถ์กฑ"์ธ์ง ๋๋ "์๊ฐ์ ์ฃผ๋" ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง "๋ฌผ์ง"์ ๋ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
์ ์ ํ๊ฐ ํ๋ก์ธ์ค ์ ๋ชฉ์ ์ "๋ณ๊ฒฝ์ด ์์๋๋ ์ด์ ์ ์ ๊ณตํ๋์ง ๋๋ ์์์น ๋ชปํ ๋น์ฉ์ ๋ฐ์์์ผฐ๋์ง"(ํ๋ก์ธ์ค์ 5๋จ๊ณ)๋ฅผ ๊ถ๊ทน์ ์ผ๋ก ์๋ณํ๋ ๊ฒ์ ๋๋ค.
1๋จ๊ณ๋ฅผ ํต๊ณผํ์ต๋๋ค. Go ํ์ด ์๋ฝํ ๊ฐ์น๊ฐ ์๋ ํน์ ์ ์์ ์ ํํ์ต๋๋ค. ์ด ์ ์์ ๊ทธ ์ค ํ๋์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๊ฝค ์ด๋ ต๊ฒ ์๊ฐํ๊ณ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์๋ค๋ฉด ์ ํํ์ง ์์์ ๊ฒ์ ๋๋ค. ํนํ, Go ์ฝ๋์๋ ์ค๋ฅ ์ฒ๋ฆฌ์๋ง ๊ด๋ จ๋ ์๋นํ ์์ ์์ฉ๊ตฌ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ ์์ ํ๊ณต์์ ๋์จ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ 1๋ ๋๊ฒ ๋ค์ํ ํํ๋ก ์ด์ ๋ํด ๋ ผ์ํด ์์ต๋๋ค.
ํ์ฌ 2๋จ๊ณ์ ์์ด ์ต์ข
๊ฒฐ์ ๊น์ง๋ ์์ง ๋ฉ์์ต๋๋ค. 2๋จ๊ณ๋ ํผ๋๋ฐฑ๊ณผ ์ฐ๋ ค ์ฌํญ์ ์์งํ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์์ ๋ถ๋ช
ํ ํ์๋ฉด: ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์์ ํ ๋์์ธ์ _๊ธฐ์ ์ _ ๊ฒฐํจ์ ์ง์ ํ๋ ๋จ ํ๋์ ์๊ฒฌ๋ง ์์์ต๋๋ค. try
๊ฐ ์ค์ ๋ก ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ณ ์ฝ๋๋ฅผ ๋จ์ํํ ๊ฒ์ด๋ผ๋ ์ค์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ์ ๋ํ ์๊ฒฌ๋ ๊ฝค ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ try
๊ฐ ๋ณ๋ก ๋์์ด ๋์ง ์๋๋ค๋ ๋ช ๊ฐ์ง ์๊ฒฌ์ด ์์์ต๋๋ค. ๋ํ ์ค์ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋๋ค. ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ฑฐ๋ ๊ธฐ์ ์ ๊ฒฐํจ์ ์ง์ ํ๋ ์ด๋ฌํ ๊ตฌ์ฒด์ ์ธ ํผ๋๋ฐฑ์ ์คํ ๊ฐ๋ฅํ๊ณ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ ๋์ ์ผ๋ก ๊ณ ๋ คํ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณธ์ง์ ์ผ๋ก ๊ฐ์ธ์ ์ธ ๊ฐ์ ์ ๋ด์ ๋ฐฉ๋ํ ์์ ๋๊ธ์ด ์์์ต๋๋ค. ์ด๊ฒ์ ๋ ์คํ ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ฌด์ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ณผ์ ์ ๊ณ ์ํ๋ค๊ณ ํด์ ์ฐ๋ฆฌ๊ฐ "๋ง์ด ๋ฃ์ง ์๋" ๊ฒ์ ์๋๋๋ค.
์ด ์๊ฒฌ์ ๊ดํ์ฌ: ์ด ์ ์์ ๋ํด ๋์ธ ๋ช ์ ๋์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ด๋ ๋ฐ๋์๊ฐ ์์ต๋๋ค. ๋น์ ์ ๋น์ ์ด ๋๊ตฌ์ธ์ง ์๋๋ค. ๊ทธ๋ค์ ์ข ์ข ํ๋ฃจ์ ์ฌ๋ฌ ๋ฒ ๊ฒ์๋ฌผ์ ์ฌ๋ฆฌ๋ฉด์ ์ด ํ ๋ก ์ ์ง๋ฐฐํ๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ป์ ์ ์๋ ์๋ก์ด ์ ๋ณด๋ ๊ฑฐ์ ์์ต๋๋ค. ์ฆ๊ฐ๋ ๊ฒ์๋ฌผ ์๋ ๋ํ ์ปค๋ฎค๋ํฐ์ "๊ฐ๋ ฅํ" ๊ฐ์ ์ ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์ด ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ฌ๋๋ค๋ณด๋ค ๋ ๋ชฉ์๋ฆฌ๊ฐ ํฌ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@iand @rsc ๊ฐ ์ ๊ณตํ ๋ต๋ณ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. ๋๋ ๊ทธ ๋๋ต์ ์ด๋ ๋ถ๋ถ์ด "์ค์ง ๋ถ์กฑ"์ธ์ง ๋๋ "์๊ฐ์ ์ฃผ๋" ๋ฐ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง "๋ฌผ์ง"์ ๋ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
@griesemer ์๋ํ์ง ์์ ๋ง์ด๋ผ๊ณ ํ์ ํ์ง๋ง ์ธ์ฉํ ๋จ์ด ์ค ์ด๋ ๊ฒ๋ ๋ด ๊ฒ์ด ์๋๋ผ ๋์ค์ ๋๊ธ์ ๋จ๊ธด ์ฌ๋์ ๊ฒ์ด์์์ ์๋ ค๋๋ฆฝ๋๋ค.
๊ทธ ์ธ์๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ณ try
์ ์ฑ๊ณต์ ๋จ์ํํ๋ ๊ฒ ์ธ์๋ ๋ ์ข๊ณ ๋ช
ํํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋์ง ์ฌ๋ถ๊ฐ ํ๋จ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@iand ์ค์ ๋ก - ๊ทธ๊ฒ์ ๋จ์ง ๋์ ๊ฐ๋ ์ด์์ต๋๋ค. ์ฃ์กํฉ๋๋ค.
์ฐ๋ฆฌ๋ try
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ค์ ์ฝ๋์ tryhard
์ ๋ํ ์์ฒด ์คํ์์ ์ป์ ๋ง์ ์ฆ๊ฑฐ๋ ์๋นํ ์ ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋
์ฑ์ ๋ ์ฃผ๊ด์ ์ด๊ณ ์๋ํํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
@griesemer
์ด๋ค ์ฌ์ฉ ํจํด์ ๋งํ๋ ๊ฒ์ ๋๊น?
๋๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ์กด์ nil-check ํจํด์ด ์๋๋ผ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ try
์ฃผ๋ณ์ผ๋ก ๋ฐ์ ํ ์ฌ์ฉ ํจํด์ ์ธ๊ธํ๊ณ ์์ต๋๋ค. ์ค์ฉ ๋ฐ ๋จ์ฉ์ ๊ฐ๋ฅ์ฑ์ ํนํ ๋ค๋ฅธ ์ธ์ด์์ ์๋ฏธ๋ก ์ ์ผ๋ก ๋ค๋ฅธ ๋ฒ์ ์ try-catch๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋จธ์ ์ง์์ ์ธ ์ ์
์ผ๋ก ์ธํด ํฌ๊ฒ ์๋ ค์ง์ง ์์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ๊ณผ ํต์ฌ ์ธ์ด์ ์ฅ๊ธฐ์ ์ธ ์์ ์ฑ์ ๋ํ ๊ณ ๋ ค ์ฌํญ์ x ํจํค์ง ๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ์ด ๊ธฐ๋ฅ์ ๋์
ํ๋ค๊ณ ์๊ฐํ๊ฒ ํฉ๋๋ค(ํจํค์ง errors/try
๋๋ errors.Try()
).
@mattparlmer ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง g, m(์คํ ํ๋ฆ์ ์ฌ์ ์ํ๋ ๋ฐ ํ์)์ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์ ์์ด Go ๋ฐํ์์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@fabian-f
@mattparlmer ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง g, m(์คํ ํ๋ฆ์ ์ฌ์ ์ํ๋ ๋ฐ ํ์)์ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์ ์์ด Go ๋ฐํ์์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ ์ง ์์ต๋๋ค. ๋์์ธ ๋ฌธ์ ์์ ์ธ๊ธํ๋ฏ์ด ์ปดํ์ผ ํ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ ๋ณํ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
try
์ ์๋ฏธ๋ if
๋ฐ return
์ธก๋ฉด์์ ์์ ํ ํํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. if
๋ฐ return
๋ณด๋ค ์ค์ ๋ก "์คํ ํ๋ฆ์ ๋ฌด์"ํ์ง ์์ต๋๋ค.
๋ค์์ ์ฐ๋ฆฌ ํ์ฌ์ 300k ๋ผ์ธ Go ์ฝ๋๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ tryhard
๋ณด๊ณ ์์
๋๋ค.
์ด๊ธฐ ์คํ:
--- stats ---
13879 (100.0% of 13879) func declarations
4381 ( 31.6% of 13879) func declarations returning an error
38435 (100.0% of 38435) statements
8028 ( 20.9% of 38435) if statements
4496 ( 56.0% of 8028) if <err> != nil statements
453 ( 10.1% of 4496) try candidates
4 ( 0.1% of 4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
3066 ( 68.2% of 4496) { return ... zero values ..., expr }
356 ( 7.9% of 4496) single statement then branch
345 ( 7.7% of 4496) complex then branch; cannot use try
63 ( 1.4% of 4496) non-empty else branch; cannot use try
์ฐ๋ฆฌ๋ juju์ errgo ํจํค์ง(https://godoc.org/github.com/juju/errgo)๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ง์คํนํ๊ณ ์คํ ์ถ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ท์น์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋๋ถ๋ถ์ ์ฌ์์ฑ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์ค๋ฅ ๋ฐํ์ ํผํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก try
๋ฅผ ์ฑํํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ ์ฉํ ๋ฉํธ๋ฆญ์ธ ๊ฒ ๊ฐ์์ errgo.Mask()
ํธ์ถ(์ฃผ์ ์์ด ์ค๋ฅ๋ฅผ ๋ฐํํจ)์ ์ ๊ฑฐํ๊ณ tryhard
๋ฅผ ๋ค์ ์คํํ์ต๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ errgo๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์ผ๋ง๋ ๋ง์ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ๋ค์ ์์ฑํ ์ ์๋์ง์ ๋ํ ์ถ์ ์น์
๋๋ค.
--- stats ---
13879 (100.0% of 13879) func declarations
4381 ( 31.6% of 13879) func declarations returning an error
38435 (100.0% of 38435) statements
8028 ( 20.9% of 38435) if statements
4496 ( 56.0% of 8028) if <err> != nil statements
3114 ( 69.3% of 4496) try candidates
7 ( 0.2% of 4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
381 ( 8.5% of 4496) { return ... zero values ..., expr }
358 ( 8.0% of 4496) single statement then branch
345 ( 7.7% of 4496) complex then branch; cannot use try
63 ( 1.4% of 4496) non-empty else branch; cannot use try
๋ฐ๋ผ์ ์ค๋ฅ ๋ฐํ์ ~70%๋ try
์ ํธํ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ ์์์ ๋ํ ๋์ ์ฃผ์ ๊ด์ฌ์ฌ๋ ๋ด๊ฐ ์ฝ์ ์๊ฒฌ์ด๋ ํ ๋ก ์์ฝ์์ ํฌ์ฐฉ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ ์์ ์ฃผ์ ์ค๋ฅ์ ์๋์ ๋น์ฉ์ ์๋นํ ์ฆ๊ฐ์ํต๋๋ค.
ํ์ฌ ์ค๋ฅ์ ์ผ๋ถ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ํ๊ณ ๋น์ฉ์ ๋งค์ฐ ๋ฎ์ต๋๋ค. ํ์ ๋ฌธ์์ด์ ์
๋ ฅํ๋ ๊ฒ ์ด์์
๋๋ค. ์ด ์ ์์ด ์ฑํ๋๋ฉด ์์ง๋์ด๋ค์ด try
์์ ์ ๊ณตํ๋ ๋ฏธํ์ ์ ์ ๋ ์ ํธํ๊ฒ ๋์ง ์์๊น ๊ฑฑ์ ๋ฉ๋๋ค. ๋ ๊ฐ์ง ๋ชจ๋ ์ฝ๋๋ฅผ "๋ ๋งค๋๋ฝ๊ฒ ๋ณด์ด๊ฒ ํ๊ธฐ" ๋๋ฌธ์
๋๋ค. ๋ด ๊ฒฝํ์), ์ด์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ถ๊ฐ ๋ธ๋ก์ด ํ์ํฉ๋๋ค. ๊ทธ๋ค์ "๊ฐ๋
์ฑ" ์ธ์์ ๊ทผ๊ฑฐํ์ฌ ๊ทธ๊ฒ์ ์ ๋นํํ ์ ์์ต๋๋ค. ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฐฉ๋ฒ์ด 3์ค ๋ ํ์ฅ๋๊ณ ๋
์๊ฐ ์์ ์์ ์ฃผ์๋ฅผ ๋ถ์ฐ์ํค๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ๋๋ ๊ธฐ์
์ฝ๋ ๊ธฐ๋ฐ์ด ์ฌ๋ฐ๋ฅธ ์ผ์ ์ฝ๊ฒ ํ๋ ๊ฒ์ด ๊ฒฐ๊ณผ ์ฝ๋ ํ์ง์ ์ธก์ ๊ฐ๋ฅํ ์ํฅ์ ๋ฏธ์น๊ณ , ์ฝ๋ ๋ฆฌ๋ทฐ์ ํ์ง์ด ๋ค์ํ๊ณ , ํ ๊ดํ์ด ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ๋ค๋ฅด๋ค๋ ์ ์์ Go ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. . ์ด์จ๋ , ๋น์ ์ด ์ ์ ๋งํ๋ฏ์ด, ์ฐ๋ฆฌ๋ ํญ์ ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์ try
๋ฅผ ์ฑํํ ์ ์์ต๋๋ค.
๊ณ ๋ คํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค
@mattparlmer
์ด ๋ชจ๋ ๊ฒ๊ณผ ํต์ฌ ์ธ์ด์ ์ฅ๊ธฐ์ ์์ ์ฑ์ ๋ํ ๊ณ ๋ ค ์ฌํญ์ x ํจํค์ง ๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ์ด ๊ธฐ๋ฅ์ ๋์ ํ๋ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค(ํจํค์ง
errors/try
๋๋errors.Try()
) ๋ด์ฅ์ผ๋ก ๋์ ํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
try
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ํจ์๊ฐ ํธ์ถ์๋ก๋ถํฐ ๋ฐํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ(#32473์ผ๋ก ์ ์๋ ํ์ฑํ) ๋๋ถ๋ถ์ ๋ค๋ฅธ ๋ด์ฅ ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Go์์ try
์ ์๋ช
์ ํํํ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์ ๋ค๋ฆญ์ ๊ฒฝ์ฐ์๋ ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์์ ๊ฒ์
๋๋ค. ๋ ๋ถ๋ถ์ ์๋ ๋์์ธ ๋ฌธ์ FAQ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ํ try
๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ก ๊ตฌํํ๋ ค๋ฉด ๋ ์ฅํฉํ ์ด๋ฆ์ด ํ์ํ๋ฏ๋ก ๋ถ๋ถ์ ์ผ๋ก ์ฌ์ฉ์ ์์ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์์ค ์ฝ๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ก ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ๋ ๋ฒ์ด๋ ๊ตฌํ๋์์ต๋๋ค. https://github.com/rhysd/trygo ๋ฐ https://github.com/lunixbochs/og๋ฅผ ์ฐธ์กฐํ์ธ์.
tegola์ ์ฝ๋ ๊ธฐ๋ฐ ์ค ~60%๊ฐ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์์ tegola ํ๋ก์ ํธ์ ๋ํ tryhard์ ์ถ๋ ฅ์ ๋๋ค. (http://github.com/go-spatial/tegola)
--- try candidates ---
1 tegola/atlas/atlas.go:84
2 tegola/atlas/map.go:232
3 tegola/atlas/map.go:238
4 tegola/atlas/map.go:248
5 tegola/atlas/map.go:253
6 tegola/basic/geometry_math.go:248
7 tegola/basic/geometry_math.go:251
8 tegola/basic/geometry_math.go:268
9 tegola/basic/geometry_math.go:276
10 tegola/basic/json_marshal.go:33
11 tegola/basic/json_marshal.go:153
12 tegola/basic/json_marshal.go:276
13 tegola/cache/azblob/azblob.go:54
14 tegola/cache/azblob/azblob.go:61
15 tegola/cache/azblob/azblob.go:67
16 tegola/cache/azblob/azblob.go:74
17 tegola/cache/azblob/azblob.go:80
18 tegola/cache/azblob/azblob.go:105
19 tegola/cache/azblob/azblob.go:109
20 tegola/cache/azblob/azblob.go:204
21 tegola/cache/azblob/azblob.go:259
22 tegola/cache/file/file.go:42
23 tegola/cache/file/file.go:56
24 tegola/cache/file/file.go:110
25 tegola/cache/file/file.go:116
26 tegola/cache/file/file.go:129
27 tegola/cache/redis/redis.go:41
28 tegola/cache/redis/redis.go:46
29 tegola/cache/redis/redis.go:51
30 tegola/cache/redis/redis.go:56
31 tegola/cache/redis/redis.go:70
32 tegola/cache/redis/redis.go:79
33 tegola/cache/redis/redis.go:84
34 tegola/cache/s3/s3.go:85
35 tegola/cache/s3/s3.go:102
36 tegola/cache/s3/s3.go:112
37 tegola/cache/s3/s3.go:118
38 tegola/cache/s3/s3.go:123
39 tegola/cache/s3/s3.go:138
40 tegola/cache/s3/s3.go:164
41 tegola/cache/s3/s3.go:172
42 tegola/cache/s3/s3.go:179
43 tegola/cache/s3/s3.go:284
44 tegola/cache/s3/s3.go:340
45 tegola/cmd/tegola/cmd/cache/format.go:97
46 tegola/cmd/tegola/cmd/cache/seed_purge.go:94
47 tegola/cmd/tegola/cmd/cache/seed_purge.go:103
48 tegola/cmd/tegola/cmd/cache/seed_purge.go:170
49 tegola/cmd/tegola/cmd/cache/tile_list.go:51
50 tegola/cmd/tegola/cmd/cache/tile_list.go:64
51 tegola/cmd/tegola/cmd/cache/tile_name.go:35
52 tegola/cmd/tegola/cmd/cache/tile_name.go:43
53 tegola/cmd/tegola/cmd/root.go:58
54 tegola/cmd/tegola/cmd/root.go:61
55 tegola/cmd/xyz2svg/cmd/draw.go:62
56 tegola/cmd/xyz2svg/cmd/draw.go:70
57 tegola/cmd/xyz2svg/cmd/draw.go:214
58 tegola/config/config.go:96
59 tegola/internal/env/parse.go:30
60 tegola/internal/env/parse.go:69
61 tegola/internal/env/parse.go:116
62 tegola/internal/env/parse.go:174
63 tegola/internal/env/parse.go:221
64 tegola/internal/env/types.go:67
65 tegola/internal/env/types.go:86
66 tegola/internal/env/types.go:105
67 tegola/internal/env/types.go:124
68 tegola/internal/env/types.go:143
69 tegola/maths/makevalid/main.go:189
70 tegola/maths/makevalid/main.go:207
71 tegola/maths/makevalid/main.go:221
72 tegola/maths/makevalid/main.go:295
73 tegola/maths/makevalid/main.go:504
74 tegola/maths/makevalid/makevalid.go:77
75 tegola/maths/makevalid/makevalid.go:89
76 tegola/maths/makevalid/makevalid.go:118
77 tegola/maths/makevalid/makevalid_test.go:93
78 tegola/maths/makevalid/makevalid_test.go:163
79 tegola/maths/makevalid/plyg/ring.go:518
80 tegola/maths/triangle.go:1023
81 tegola/mvt/layer.go:73
82 tegola/mvt/layer.go:79
83 tegola/mvt/vector_tile/vector_tile.pb.go:64
84 tegola/provider/gpkg/gpkg.go:138
85 tegola/provider/gpkg/gpkg.go:223
86 tegola/provider/gpkg/gpkg_register.go:46
87 tegola/provider/gpkg/gpkg_register.go:51
88 tegola/provider/gpkg/gpkg_register.go:186
89 tegola/provider/gpkg/gpkg_register.go:227
90 tegola/provider/gpkg/gpkg_register.go:240
91 tegola/provider/gpkg/gpkg_register.go:245
92 tegola/provider/gpkg/gpkg_register.go:256
93 tegola/provider/gpkg/gpkg_register.go:377
94 tegola/provider/postgis/postgis.go:112
95 tegola/provider/postgis/postgis.go:117
96 tegola/provider/postgis/postgis.go:122
97 tegola/provider/postgis/postgis.go:127
98 tegola/provider/postgis/postgis.go:136
99 tegola/provider/postgis/postgis.go:142
100 tegola/provider/postgis/postgis.go:148
101 tegola/provider/postgis/postgis.go:153
102 tegola/provider/postgis/postgis.go:158
103 tegola/provider/postgis/postgis.go:163
104 tegola/provider/postgis/postgis.go:181
105 tegola/provider/postgis/postgis.go:198
106 tegola/provider/postgis/postgis.go:264
107 tegola/provider/postgis/postgis.go:441
108 tegola/provider/postgis/postgis.go:446
109 tegola/provider/postgis/postgis.go:529
110 tegola/provider/postgis/postgis.go:559
111 tegola/provider/postgis/postgis.go:603
112 tegola/provider/postgis/util.go:31
113 tegola/provider/postgis/util.go:36
114 tegola/provider/postgis/util.go:200
115 tegola/server/bindata/bindata.go:89
116 tegola/server/bindata/bindata.go:109
117 tegola/server/bindata/bindata.go:129
118 tegola/server/bindata/bindata.go:149
119 tegola/server/bindata/bindata.go:169
120 tegola/server/bindata/bindata.go:189
121 tegola/server/bindata/bindata.go:209
122 tegola/server/bindata/bindata.go:229
123 tegola/server/bindata/bindata.go:370
124 tegola/server/bindata/bindata.go:374
125 tegola/server/bindata/bindata.go:378
126 tegola/server/bindata/bindata.go:382
127 tegola/server/bindata/bindata.go:386
128 tegola/server/bindata/bindata.go:402
129 tegola/server/middleware_gzip.go:71
130 tegola/server/middleware_gzip.go:78
131 tegola/server/server_test.go:85
--- <err> name is different from "err" ---
1 tegola/basic/json_marshal.go:276
--- { return ... zero values ..., expr } ---
1 tegola/basic/geometry_math.go:214
2 tegola/basic/geometry_math.go:222
3 tegola/basic/geometry_math.go:230
4 tegola/cache/azblob/azblob.go:131
5 tegola/cache/azblob/azblob.go:140
6 tegola/cache/azblob/azblob.go:149
7 tegola/cache/azblob/azblob.go:171
8 tegola/cache/file/file.go:47
9 tegola/cache/s3/s3.go:92
10 tegola/cmd/internal/register/maps.go:108
11 tegola/cmd/tegola/cmd/cache/flags.go:20
12 tegola/cmd/tegola/cmd/cache/tile_name.go:51
13 tegola/cmd/tegola/cmd/cache/worker.go:112
14 tegola/cmd/tegola/cmd/cache/worker.go:123
15 tegola/cmd/tegola/cmd/root.go:73
16 tegola/cmd/tegola/cmd/root.go:78
17 tegola/cmd/xyz2svg/cmd/root.go:60
18 tegola/provider/gpkg/gpkg.go:90
19 tegola/provider/gpkg/gpkg.go:95
20 tegola/provider/gpkg/gpkg_register.go:264
21 tegola/provider/gpkg/gpkg_register.go:297
22 tegola/provider/gpkg/gpkg_register.go:302
23 tegola/provider/gpkg/gpkg_register.go:313
24 tegola/provider/gpkg/gpkg_register.go:328
25 tegola/provider/postgis/postgis.go:193
26 tegola/provider/postgis/postgis.go:208
27 tegola/provider/postgis/postgis.go:222
28 tegola/provider/postgis/postgis.go:228
29 tegola/provider/postgis/postgis.go:234
30 tegola/provider/postgis/postgis.go:243
31 tegola/provider/postgis/postgis.go:249
32 tegola/provider/postgis/postgis.go:255
33 tegola/provider/postgis/postgis.go:304
34 tegola/provider/postgis/postgis.go:315
35 tegola/provider/postgis/postgis.go:319
36 tegola/provider/postgis/postgis.go:364
37 tegola/provider/postgis/postgis.go:456
38 tegola/provider/postgis/postgis.go:520
39 tegola/provider/postgis/postgis.go:534
40 tegola/provider/postgis/postgis.go:565
41 tegola/provider/postgis/util.go:108
42 tegola/provider/postgis/util.go:113
43 tegola/server/bindata/bindata.go:29
44 tegola/server/bindata/bindata.go:245
45 tegola/server/bindata/bindata.go:271
46 tegola/server/bindata/bindata.go:396
--- single statement then branch ---
1 tegola/cache/azblob/azblob.go:241
2 tegola/cache/file/file.go:87
3 tegola/cache/s3/s3.go:321
4 tegola/cmd/internal/register/caches.go:18
5 tegola/cmd/internal/register/providers.go:43
6 tegola/cmd/internal/register/providers.go:62
7 tegola/cmd/internal/register/providers.go:75
8 tegola/config/config.go:192
9 tegola/config/config.go:207
10 tegola/config/config.go:217
11 tegola/internal/env/dict.go:43
12 tegola/internal/env/dict.go:121
13 tegola/internal/env/dict.go:197
14 tegola/internal/env/dict.go:273
15 tegola/internal/env/dict.go:348
16 tegola/internal/env/parse.go:79
17 tegola/internal/env/parse.go:126
18 tegola/internal/env/parse.go:184
19 tegola/internal/env/parse.go:231
20 tegola/maths/makevalid/plyg/ring.go:541
21 tegola/maths/maths.go:239
22 tegola/maths/validate/validate.go:49
23 tegola/maths/validate/validate.go:53
24 tegola/maths/validate/validate.go:59
25 tegola/maths/validate/validate.go:69
26 tegola/mvt/feature.go:94
27 tegola/mvt/feature.go:99
28 tegola/mvt/feature.go:592
29 tegola/mvt/feature.go:603
30 tegola/mvt/layer.go:90
31 tegola/mvt/tile.go:48
32 tegola/provider/postgis/postgis.go:570
33 tegola/provider/postgis/postgis.go:586
34 tegola/tile.go:172
--- complex then branch; cannot use try ---
1 tegola/cache/azblob/azblob.go:226
2 tegola/cache/file/file.go:78
3 tegola/cache/file/file.go:122
4 tegola/cache/s3/s3.go:195
5 tegola/cache/s3/s3.go:206
6 tegola/cache/s3/s3.go:219
7 tegola/cache/s3/s3.go:307
8 tegola/provider/gpkg/gpkg.go:39
9 tegola/provider/gpkg/gpkg.go:45
10 tegola/provider/gpkg/gpkg.go:131
11 tegola/provider/gpkg/gpkg.go:154
12 tegola/provider/gpkg/gpkg_register.go:171
13 tegola/provider/gpkg/gpkg_register.go:195
--- stats ---
1294 (100.0% of 1294) func declarations
246 ( 19.0% of 1294) func declarations returning an error
2693 (100.0% of 2693) statements
551 ( 20.5% of 2693) if statements
238 ( 43.2% of 551) if <err> != nil statements
131 ( 55.0% of 238) try candidates
1 ( 0.4% of 238) <err> name is different from "err"
--- non-try candidates ---
46 ( 19.3% of 238) { return ... zero values ..., expr }
34 ( 14.3% of 238) single statement then branch
13 ( 5.5% of 238) complex then branch; cannot use try
0 ( 0.0% of 238) non-empty else branch; cannot use try
๊ทธ๋ฆฌ๊ณ ๋๋ฐ ํ๋ก์ ํธ: (http://github.com/go-spatial/geom)
--- try candidates ---
1 geom/bbox.go:202
2 geom/encoding/geojson/geojson.go:152
3 geom/encoding/geojson/geojson.go:157
4 geom/encoding/wkb/internal/tcase/symbol/symbol.go:73
5 geom/encoding/wkb/internal/tcase/tcase.go:161
6 geom/encoding/wkb/internal/tcase/tcase.go:172
7 geom/encoding/wkb/wkb.go:50
8 geom/encoding/wkb/wkb.go:110
9 geom/encoding/wkt/internal/token/token.go:176
10 geom/encoding/wkt/internal/token/token.go:252
11 geom/internal/parsing/parsing.go:44
12 geom/internal/parsing/parsing.go:85
13 geom/internal/rtreego/rtree_test.go:110
14 geom/multi_line_string.go:34
15 geom/multi_polygon.go:35
16 geom/planar/clip/linestring.go:82
17 geom/planar/clip/linestring.go:181
18 geom/planar/clip/point.go:23
19 geom/planar/intersect/xsweep.go:106
20 geom/planar/makevalid/makevalid.go:92
21 geom/planar/makevalid/makevalid.go:191
22 geom/planar/makevalid/setdiff/polygoncleaner.go:283
23 geom/planar/makevalid/setdiff/polygoncleaner.go:345
24 geom/planar/makevalid/setdiff/polygoncleaner.go:543
25 geom/planar/makevalid/setdiff/polygoncleaner.go:554
26 geom/planar/makevalid/setdiff/polygoncleaner.go:572
27 geom/planar/makevalid/setdiff/polygoncleaner.go:578
28 geom/planar/simplify/douglaspeucker.go:84
29 geom/planar/simplify/douglaspeucker.go:88
30 geom/planar/simplify.go:13
31 geom/planar/triangulate/constraineddelaunay/triangle.go:186
32 geom/planar/triangulate/constraineddelaunay/triangulator.go:134
33 geom/planar/triangulate/constraineddelaunay/triangulator.go:138
34 geom/planar/triangulate/constraineddelaunay/triangulator.go:142
35 geom/planar/triangulate/constraineddelaunay/triangulator.go:173
36 geom/planar/triangulate/constraineddelaunay/triangulator.go:176
37 geom/planar/triangulate/constraineddelaunay/triangulator.go:203
38 geom/planar/triangulate/constraineddelaunay/triangulator.go:248
39 geom/planar/triangulate/constraineddelaunay/triangulator.go:396
40 geom/planar/triangulate/constraineddelaunay/triangulator.go:466
41 geom/planar/triangulate/constraineddelaunay/triangulator.go:553
42 geom/planar/triangulate/constraineddelaunay/triangulator.go:583
43 geom/planar/triangulate/constraineddelaunay/triangulator.go:667
44 geom/planar/triangulate/constraineddelaunay/triangulator.go:672
45 geom/planar/triangulate/constraineddelaunay/triangulator.go:677
46 geom/planar/triangulate/constraineddelaunay/triangulator.go:814
47 geom/planar/triangulate/constraineddelaunay/triangulator.go:818
48 geom/planar/triangulate/constraineddelaunay/triangulator.go:823
49 geom/planar/triangulate/constraineddelaunay/triangulator.go:865
50 geom/planar/triangulate/constraineddelaunay/triangulator.go:870
51 geom/planar/triangulate/constraineddelaunay/triangulator.go:875
52 geom/planar/triangulate/constraineddelaunay/triangulator.go:897
53 geom/planar/triangulate/constraineddelaunay/triangulator.go:901
54 geom/planar/triangulate/constraineddelaunay/triangulator.go:907
55 geom/planar/triangulate/constraineddelaunay/triangulator.go:1107
56 geom/planar/triangulate/constraineddelaunay/triangulator.go:1146
57 geom/planar/triangulate/constraineddelaunay/triangulator.go:1157
58 geom/planar/triangulate/constraineddelaunay/triangulator.go:1202
59 geom/planar/triangulate/constraineddelaunay/triangulator.go:1206
60 geom/planar/triangulate/constraineddelaunay/triangulator.go:1216
61 geom/planar/triangulate/delaunaytriangulationbuilder.go:66
62 geom/planar/triangulate/incrementaldelaunaytriangulator.go:46
63 geom/planar/triangulate/incrementaldelaunaytriangulator.go:78
64 geom/planar/triangulate/quadedge/lastfoundquadedgelocator.go:65
65 geom/planar/triangulate/quadedge/quadedgesubdivision.go:976
66 geom/slippy/tile.go:133
--- { return ... zero values ..., expr } ---
1 geom/internal/parsing/parsing.go:125
2 geom/planar/triangulate/constraineddelaunay/triangulator.go:428
3 geom/planar/triangulate/constraineddelaunay/triangulator.go:447
4 geom/planar/triangulate/constraineddelaunay/triangulator.go:460
--- single statement then branch ---
1 geom/bbox.go:259
2 geom/encoding/wkb/internal/decode/decode.go:29
3 geom/encoding/wkb/internal/decode/decode.go:55
4 geom/encoding/wkb/internal/decode/decode.go:63
5 geom/encoding/wkb/internal/decode/decode.go:70
6 geom/encoding/wkb/internal/decode/decode.go:79
7 geom/encoding/wkb/internal/decode/decode.go:84
8 geom/encoding/wkb/internal/decode/decode.go:93
9 geom/encoding/wkb/internal/decode/decode.go:99
10 geom/encoding/wkb/internal/decode/decode.go:105
11 geom/encoding/wkb/internal/decode/decode.go:114
12 geom/encoding/wkb/internal/decode/decode.go:119
13 geom/encoding/wkb/internal/decode/decode.go:135
14 geom/encoding/wkb/internal/decode/decode.go:140
15 geom/encoding/wkb/internal/decode/decode.go:149
16 geom/encoding/wkb/internal/decode/decode.go:155
17 geom/encoding/wkb/internal/decode/decode.go:161
18 geom/encoding/wkb/internal/decode/decode.go:170
19 geom/encoding/wkb/internal/decode/decode.go:176
20 geom/encoding/wkb/internal/tcase/token/token.go:162
21 geom/encoding/wkt/internal/token/token.go:136
--- complex then branch; cannot use try ---
1 geom/encoding/wkb/internal/tcase/tcase.go:74
2 geom/encoding/wkt/internal/symbol/symbol.go:125
3 geom/planar/intersect/xsweep.go:165
4 geom/planar/makevalid/makevalid.go:85
5 geom/planar/makevalid/makevalid.go:172
6 geom/planar/makevalid/triangulate.go:19
7 geom/planar/makevalid/triangulate.go:28
8 geom/planar/makevalid/triangulate.go:36
9 geom/planar/makevalid/triangulate.go:58
10 geom/planar/triangulate/constraineddelaunay/triangulator.go:358
11 geom/planar/triangulate/constraineddelaunay/triangulator.go:373
12 geom/planar/triangulate/constraineddelaunay/triangulator.go:453
13 geom/planar/triangulate/constraineddelaunay/triangulator.go:1237
14 geom/planar/triangulate/constraineddelaunay/triangulator.go:1243
15 geom/planar/triangulate/constraineddelaunay/triangulator.go:1249
--- stats ---
820 (100.0% of 820) func declarations
146 ( 17.8% of 820) func declarations returning an error
1715 (100.0% of 1715) statements
391 ( 22.8% of 1715) if statements
111 ( 28.4% of 391) if <err> != nil statements
66 ( 59.5% of 111) try candidates
0 ( 0.0% of 111) <err> name is different from "err"
--- non-try candidates ---
4 ( 3.6% of 111) { return ... zero values ..., expr }
21 ( 18.9% of 111) single statement then branch
15 ( 13.5% of 111) complex then branch; cannot use try
0 ( 0.0% of 111) non-empty else branch; cannot use try
์์์น ๋ชปํ ๋น์ฉ ๋ฌธ์ ๋ก #32611์์ ๋ค์ ๊ฒ์ํฉ๋๋ค...
์ธ ๊ฐ์ง ๋น์ฉ ํด๋์ค๊ฐ ํ์๋ฉ๋๋ค.
๋ฅด๋
ธ. 1 & 2, try()
์ ๋น์ฉ์ ์ ๋นํฉ๋๋ค.
์๋์ค๋ฅผ ์ง๋์น๊ฒ ๋จ์ํํฉ๋๋ค. 3, ๋๋ถ๋ถ์ ๋๊ธ ์์ฑ์๋ try()
๊ฐ ์ฐ๋ฆฌ ์ฝ๋ ๋ฐ/๋๋ ์ฐ๋ฆฌ๊ฐ ์์กดํ๋ ์ฝ๋ ์ํ๊ณ๋ฅผ ์์์์ผ ์์ฐ์ฑ๊ณผ ์ ํ ํ์ง์ ์ ํ์ํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋๋ฆฌ ํผ์ ธ ์๊ณ ํฉ๋ฆฌ์ ์ธ ์ธ์์ "์ฌ์ค์ด ์๋" ๋๋ "๋ฏธํ์ "์ผ๋ก ํํ๋์ด์๋ ์ ๋ฉ๋๋ค.
์ํ๊ณ์ ๋ํ ๋น์ฉ์ ์ฌ์์ด๋ ๋๊ตฌ์ ๋ํ ๋น์ฉ๋ณด๋ค ํจ์ฌ ๋ ์ค์ํฉ๋๋ค.
@griesemer "3 ๋ค์ค์ ๋ณด์ปฌ ์๋"๊ฐ ๋ฐ๋์ ๋๋ถ๋ถ์ ์ฐจ์งํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ ๋ช
๋ฐฑํ ๋ถ๊ณต์ ํฉ๋๋ค. ์๋ฐฑ ๋ช
์ ์ฌ๋๋ค์ด ์ฌ๊ธฐ์ #32825์ ๋๊ธ์ ๋ฌ์์ต๋๋ค. ๋น์ ์ 6์ 12์ผ์ "์๋ต์์ ์ฝ 2/3๊ฐ ์ ์์ ๋ง์กฑํ์ง ์๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค."๋ผ๊ณ ๋งํ์ต๋๋ค. ๊ทธ ์ดํ๋ก 2,000๋ช
์ด ๋๋ ์ฌ๋๋ค์ด " err != nil
ํผ์ ๋๊ธฐ"์ 90%์ ์์ง์๊ฐ๋ฝ์ ์น์ผ์ธ์ ํฌํํ์ต๋๋ค.
@gdey _stats ๋ฐ non-try ํ๋ณด์_๋ง ํฌํจํ๋๋ก ๊ฒ์๋ฌผ์ ์์ ํ ์ ์์ต๋๊น?
@robfig , @gdey ์ด ๋ฐ์ดํฐ, ํนํ ์ ํ ๋น๊ต๋ฅผ ์ ๊ณตํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@griesemer
๋น์ ์ ํ์คํ ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฐ๋ ค ์ฌํญ์ด ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ์ด์ง ์ ์์์ ๋ช
ํํ ํ๋ ๋ช ๊ฐ์ง ๋ด์ฉ์ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ด ์ง๋ฌธ์ Go ํ์ด 5๋จ๊ณ์์ ๋
ผ์ํ ๊ฐ์น๊ฐ ์๋ ๋น์ฉ์ผ๋ก ๊ฐ์ ๋ชจ๋(์ฆ, ๋ค์ดํค๋ ๋ฐํ ๋ฐ/๋๋ ์ง์ฐ์ ํตํ ํจ์ ํ ๋ฒ์ ์ค๋ฅ ๋์ฐ๋ณ์ด)์ ๋จ์ฉ ๊ฐ๋ฅ์ฑ์ ๋ณด๊ณ ์์ผ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ์
๋๋ค. ์ํ๋ฅผ ์ํ ์กฐ์น๋ฅผ ์ทจํฉ๋๋ค. ํ์ฌ ๋ถ์๊ธฐ๋ ์ด ์ ์์ ๊ฐ์ฅ ๋นํน์ค๋ฌ์ด ์ธก๋ฉด์ด Go ํ์ ์ํด ์๋ฆฌํ๊ณ ์ฐธ์ ํ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฃผ๋๋ค๋ ๊ฒ์
๋๋ค(์ด ๋ฌธ์ ๋ ์๋ํ๋ ๋ณํ์ ํ๊ฐ์ ์ํด ํด๊ฒฐ๋์ง ์์ผ๋ฉฐ ์ ๊ทน์ ์ผ๋ก ๊ถ์ฅ/์ง์๋๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. - errd
, ๋ํ ์ค ๋ฑ).
์ถ๊ฐํ๊ธฐ ์ํด ํธ์ง... ๋ฒ ํ
๋ Gophers๊ฐ ๊ธ์งํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ ๊ถ์ฅํ๋ Go ํ๊ณผ์ ์ฐ๋ ค๋ ๋ด๊ฐ ํค ๋์์ ๋ํด ์๋ฏธํ ๊ฒ์
๋๋ค.
... ๊ฐ์ ๊ฒฝํ์ ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๊ฒฝํํ๋ ๊ณ ํต์ ๋ฌธ์ ๋ก ๊น์ด ์ฐ๋ คํ๋ ๋น์ฉ์
๋๋ค. ์ฝ๊ฒ ๋ฒค์น๋งํนํ ์ ์๋ ๊ฒ์ด ์๋ ์๋ ์์ง๋ง(๋งค์ฐ ํฉ๋ฆฌ์ ์ด๋ผ๋ฉด) ์ด๋ฌํ ์ฐ๋ ค๋ฅผ ๊ฐ์์ ๊ทธ ์์ฒด๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ ์ ์งํ์ง ์์ต๋๋ค. ์คํ๋ ค, ํ๊ณ ํ ๋งฅ๋ฝ์ ํ๋จ ์์ด ๋จ์ํ ์ซ์์ ์ฐฌ์ฑํ์ฌ ๊ณต์ ๊ฒฝํ์ ์งํ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ ๋ด๊ฐ/์ฐ๋ฆฌ๊ฐ ๋ฐ๋ํ๋ ๊ฐ์ ์ ์ข
๋ฅ์
๋๋ค.
@networkimprov ์ถฉ๋ถํ ๋ช ํํ์ง ์์ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ด๊ฐ ํ ๋ง ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ ์์ ๋ํด 2๋ช , 34๋ช ์ ๋์ ๊ฐ๋ ฅํ ๋ฐ๋์๊ฐ ์์ ์ ์์ต๋๋ค. ๋น์ ์ ๋น์ ์ด ๋๊ตฌ์ธ์ง ์๋๋ค. ๊ทธ๋ค์ ์ข ์ข ํ๋ฃจ์ ์ฌ๋ฌ ๋ฒ ๊ฒ์๋ฌผ์ ์ฌ๋ฆฌ๋ฉด์ ์ด ํ ๋ก ์ ์ง๋ฐฐํ๊ณ ์์ต๋๋ค.
๋๋ ์ด๋ชจํฐ์ฝ์ด ์๋ ์ค์ ๋๊ธ("์์ฃผ ๊ฒ์ํ๋ ๊ฒ์๋ฌผ"์์์ ๊ฐ์ด)์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. ์ฌ๊ธฐ์ _๋ฐ๋ณต์ ์ผ๋ก_ ๊ฒ์ํ๋ ์ฌ๋์ ๋น๊ต์ ์์์ ๋ถ๊ณผํ๋ฉฐ, ์ฌ์ ํ ์ ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ํ #32825์ ๋ํด ์ด์ผ๊ธฐํ์ง ์์๋ค. ์ด ์ ์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค.
์ด๋ชจํฐ์ฝ์ ๋ณด๋ฉด ํ ๋ฌ ์ ๊ณผ ๊ฑฐ์ ๋ณํ๊ฐ ์์ต๋๋ค. ์ด๋ชจํฐ์ฝ์ 1/3์ ๊ธ์ ์ ์ธ ์๊ฒฌ์ด๊ณ 2/3๋ ๋ถ์ ์ ์ธ ์๊ฒฌ์ ๋๋ค.
@griesemer
์์ ๋ด ์๊ฒฌ ์ ์์ฑํ๋ ๋์ ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ์ตํ์ต๋๋ค. ๋์์ธ ๋ฌธ์์์๋ try
๊ฐ ๊ฐ๋จํ ๊ตฌ๋ฌธ ํธ๋ฆฌ ๋ณํ์ผ๋ก ๊ตฌํ๋ ์ ์๋ค๊ณ ๋งํ์ง๋ง ๋ง์ ๊ฒฝ์ฐ ๋ถ๋ช
ํ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๊ฒ์ํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ฐธ์กฐํ์ญ์์ค. ์๋ฅผ ๋ค์ด ๋ค์์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
switch x {
case rand.Int():
a()
case 5, try(strconv.Atoi(y)):
b()
}
switch
์ ํ๊ฐ ์์๊ฐ ์ฃผ์ด์ง๋ฉด ์๋ํ ์๋ฏธ๋ฅผ ์ ์งํ๋ฉด์ strconv.Atoi(y)
๋ฅผ case
์ ์์ ์ด๋ป๊ฒ ์ฌ์ํ๊ฒ ๋ค์ด ์ฌ๋ฆฌ๋์ง ์ ์ ์์ต๋๋ค. ๋ด๊ฐ ์๊ฐํด๋ผ ์ ์๋ ์ต์ ์ switch
๋ฅผ if
/ else
๋ช
๋ น๋ฌธ์ ๋์ผํ ์ฒด์ธ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํ๋ ๊ฒ์
๋๋ค.
if x == rand.Int() {
a()
} else if x == 5 {
b()
} else if _v, _err := strconv.Atoi(y); _err != nil {
return _err
} else if x == _v {
b()
}
(์ด๊ฒ์ด ๋์ฌ ์ ์๋ ๋ค๋ฅธ ์ํฉ์ด ์์ง๋ง ์ด๊ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ ์ ์ค ํ๋์ด๋ฉฐ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ ๋๋ค.)
์ฌ์ค, ๋น์ ์ด ์ด ์ ์์ ๋ฐํํ๊ธฐ ์ ์ ์ ๋ ๋์์ธ ์ด์์์ check
์ฐ์ฐ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํด AST ๋ฒ์ญ๊ธฐ๋ฅผ ์์
ํ๊ณ ์์๋๋ฐ ์ด ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ go/*
stdlib ํจํค์ง์ ํดํน๋ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ์๋ง๋ ์ปดํ์ผ๋ฌ ํ๋ก ํธ ์๋๋ ์ด๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๊น? ์๋๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์ณค๊ณ ์ด๊ฒ์ ํ ์์๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
https://github.com/rhysd/trygo๋ ์ฐธ์กฐํ์ญ์์ค. README์ ๋ฐ๋ฅด๋ฉด try
ํํ์์ ๊ตฌํํ์ง ์์ผ๋ฉฐ ๋ณธ์ง์ ์ผ๋ก ๋ด๊ฐ ์ฌ๊ธฐ์ ์ ๊ธฐํ๋ ๊ฒ๊ณผ ๋์ผํ ์ฐ๋ ค๋ฅผ ๋ํ๋
๋๋ค. ์์ฑ์๊ฐ ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์ ์ด์ ๊ฐ ์๋๊น ์๊ฐํฉ๋๋ค.
@daved Professional ์ฝ๋๋ ์ง๊ณต ์ํ์์ ๊ฐ๋ฐ๋์ง ์์ต๋๋ค. ์ง์ญ ๊ท์น, ์คํ์ผ ๊ถ์ฅ ์ฌํญ, ์ฝ๋ ๊ฒํ ๋ฑ์ด ์์ต๋๋ค(์ด์ ์ ๋งํ ์ ์ด ์์ต๋๋ค). ๋ฐ๋ผ์ ๋จ์ฉ์ด "๊ฐ๋ฅ์ฑ์ด ์๋" ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค(๊ฐ๋ฅํ์ง๋ง ๋ชจ๋ ์ธ์ด ๊ตฌ์ฑ์ ํด๋น๋จ).
defer
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๊ฒ์ try
์ ์ ๋ฌด์ ๊ด๊ณ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด defer
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๋ง์ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ํฌํจํ๋ ํจ์๊ฐ ํด๋น ์ฅ์์ ํ ๋ฒ ์ํํ๋ ๋ฐ๋ ํ์คํ ์ด์ ๊ฐ ์์ต๋๋ค. ๋๋ ์ฅ์์ ์ํํ๋ ๋ํผ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋๋ ๋ฒ์ ๋ฐ ์ง์ญ ์ฝ๋ฉ ๊ถ์ฅ ์ฌํญ์ ๋ง๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ. ๊ฒฐ๊ตญ "์ค๋ฅ๋ ๊ฐ์ผ ๋ฟ"์ด๋ฉฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ธ์๋ถํดํ๋ ๊ฒ์ด ์์ ํ ์ด์น์ ๋ง์ต๋๋ค.
Naked Return์ ๊ท์จ๋์ง ์์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ๊ทธ๋ค์ด ์ผ๋ฐ์ ์ผ๋ก ๋์๋ค๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ํจ์์ ๊ฒฐ๊ณผ๊ฐ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ ํจํ๋ค๋ฉด ์ค๋ฅ์ ๊ฒฝ์ฐ์ ๋ค์ดํค๋ ๋ฆฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฒฝํด ๋ณด์
๋๋ค. t ์ด ๊ฒฝ์ฐ ์ค์). try
๋ ์ ํํ ๊ทธ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ์ฌ๊ธฐ์๋ "๋จ์ฉ"์ด ์์ต๋๋ค.
@dpinela ์ปดํ์ผ๋ฌ๋ ์ด๋ฏธ ๊ทํ์ ๊ฐ์ switch
๋ช
๋ น๋ฌธ์ if-else-if
์ ์ํ์ค๋ก ๋ณํํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ํ ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉํ๋ "๊ตฌ๋ฌธ ํธ๋ฆฌ"๋ "go/ast" ๊ตฌ๋ฌธ ํธ๋ฆฌ๊ฐ ์๋๋๋ค. ์ปดํ์ผ๋ฌ์ ๋ด๋ถ ํํ์ Go๋ก ๋ค์ ๋ฒ์ญ๋ ํ์๊ฐ ์๋ ํจ์ฌ ๋ ์ ์ฐํ ์ฝ๋๋ฅผ ํ์ฉํฉ๋๋ค.
@griesemer
๋ค, ๋ฌผ๋ก , ๋น์ ์ด ๋งํ๋ ๋ชจ๋ ๊ฒ์๋ ๊ทผ๊ฑฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ ์์ญ์ ์ํ๋ ๋๋ก ๋จ์ํ์ง ์์ต๋๋ค. ์๋ชธ ๋ฐํ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ฐ๋ฅด์น๋ ์ฌ๋๋ค(์ปค๋ฎค๋ํฐ ์ฑ์ฅ/์งํฅ์ ์ํด ๋
ธ๋ ฅํ๋ ์ฐ๋ฆฌ)์ ์ํด ๋งค์ฐ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ทจ๊ธ๋ฉ๋๋ค. stdlib ์ ์ฒด์ ํฉ์ด์ ธ ์๋ค๋ ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋์ ๊ฐ๋ฅด์น ๋ ๋ช
์์ ๋ฐํ์ ํญ์ ๊ฐ์กฐ๋ฉ๋๋ค. ๊ฐ์ธ์ด ์์ ์ ์ฑ์๊ธฐ์ ๋๋ฌํ์ฌ ๋ณด๋ค "๊ธฐ์์ ์ธ" ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ ํํ๋๋ก ํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ฒ์๋ถํฐ ์ด๋ฅผ ๊ถ์ฅํ๋ ๊ฒ์ ์ฝ๊ธฐ ์ด๋ ค์ด ์ฝ๋(์ฆ, ๋์ ์ต๊ด)๋ฅผ ์กฐ์ฅํ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ค์, ๋ด๊ฐ ๋ฐํ๋ ค๊ณ ํ๋ ์์น์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๋ค์ดํค๋ ๋ฆฌํด์ด๋ ์ด์ฐ ๊ฐ์น ์กฐ์์ ๊ธ์งํ๊ณ ์ถ์ง ์์ต๋๋ค. ๊ทธ๋ค์ด ์ง์ ์ผ๋ก ์ ํฉํ ๋ ๋๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด ๊ธฐ์ฉ๋๋ค(๊ทธ๋ฌ๋ ๋ค๋ฅธ ๊ฒฝํ์ด ๋ง์ ์ฌ์ฉ์๋ ๋ ์๊ฒฉํ ์ ์ฅ์ ์ทจํ ์ ์์). ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ด๋ฌํ ๋ ์ผ๋ฐ์ ์ด๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ทจ์ฝํ ๊ธฐ๋ฅ์ ๋๋ฆฌ ํผ์ง ๋ฐฉ์์ผ๋ก ์ ์ฉํ๋๋ก ๊ถ์ฅํ๋ ๊ฒ์ ๋ฐ๋์ด ์๊ฐํ๋ ๊ฒ๊ณผ ์์ ํ ๋ฐ๋๋๋ ๋ฐฉํฅ์ ๋๋ค. ๋ง๋ฒ๊ณผ ๋ถ์์ ํ ๊ฐ์ ํํ๋ฅผ ํผํ๋ ์ฑ๊ฒฉ์ ๋๋ ทํ ๋ณํ๋ ์๋๋ ๋ณํ์ ๋๊น? DIC ๋ฐ ๊ธฐํ ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์ด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉ๋ ๊ฐ์กฐํด์ผ ํฉ๋๊น?
ps ์๊ฐ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋น์ ์ ํ๊ณผ ์ธ์ด๋ ๋ด ์กด๊ฒฝ๊ณผ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋๋ ๋ชฉ์๋ฆฌ๋ฅผ ๋ด๋ ์ฌ๋์ ์ฌํ์ ๋ฐ๋ผ์ง ์์ต๋๋ค. ๋๋ ๋น์ ์ด ๋์/์ฐ๋ฆฌ์ ๊ด์ฌ์ฌ์ ๋ณธ์ง์ ๋ฃ๊ณ ์ฐ๋ฆฌ์ "์ผ์ " ๊ด์ ์์ ์ฌ๋ฌผ์ ๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด downvote์ ๋ช ๊ฐ์ง ์๊ฒฌ์ ์ถ๊ฐํฉ๋๋ค.
ํ์ฌ ์งํ ์ค์ธ ํน์ ์ ์:
1) ์ ์ด ํ๋ฆ ๋ฐ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋ํด ์ด์ ์ ๋ช ํํ ์ค๋ช ๋ ์ด์ ๋ก ํค์๋ ๋ ๋ด์ฅ ํจ์๋ก ์ด๊ฒ์ ํฌ๊ฒ ์ ํธํฉ๋๋ค.
2) ์๋ฏธ์ "์๋"๋ ํผ๋ขฐ์นจ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋ ํ "try"๋ guard
๋๋ ensure
๊ฐ์ ์ด๋ฆ์ผ๋ก ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3) ์ด ๋ ๊ฐ์ง ์ ์ธ์, ๋๋ ์ด๊ฒ์ด ์ด๋ฐ ์ข ๋ฅ์ ๊ฒ์ ๋ํด ๋ด๊ฐ ๋ณธ ์ต๊ณ ์ ์ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
try/guard/ensure
๊ฐ๋
์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ $# if err != nil
๋ฅผ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ๋ํ ๋ด ๋ฐ๋ ์๊ฒฌ์ ๋ช ๊ฐ์ง ๋ ์ค๋ช
ํฉ๋๋ค.
1) ์ด๊ฒ์ golang์ ์๋ ๋ช ๋ น ์ค ํ๋(์ต์ํ ๋ด๊ฐ ์ธ์ํ ๋๋ก)์ ์๋ฐฐ๋ฉ๋๋ค. '๋ง๋ฒ'์ด ๊ฑฐ์ ์์ด ๋ช ํํ๊ณ ์ฝ๊ธฐ/์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
2) ์ด๊ฒ์ ์๊ฐ์ด ํ์ํ ์ ํํ ์๊ฐ์ ๊ฒ์ผ๋ฆ์ ์กฐ์ฅ ํ ๊ฒ์ ๋๋ค. ํ์ผ ์ด๊ธฐ, ๋คํธ์ํฌ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก ๋ฑ๊ณผ ๊ฐ์ "๋ณด์ผ๋ฌํ๋ ์ดํธ" ์์ ์ ์ํํ๋ ๋์ ๋ฐ์ํ ์ ์๋ ๋ง์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ด์ง ์์ ์ค๋ฅ ์๋๋ฆฌ์ค๋ฅผ ๋ฌด์ํ๋ ๋ง์ "์๋"๋ก ์์ํ ์ ์์ง๋ง ๊ฒฐ๊ตญ ์ด๋ฌํ " ์๋"๋ ๊ณ ์ ํ ๋ฐฑ์คํ/์ฌ์๋, ๋ก๊น /์ถ์ ๋ฐ/๋๋ ์ ๋ฆฌ ์์ ์ ๊ตฌํํด์ผ ํ ์ ์์ผ๋ฏ๋ก ์ฌ๋ผ์ง๋๋ค. "๋ฎ์ ํ๋ฅ ์ด๋ฒคํธ"๋ ๋๊ท๋ชจ๋ก ๋ณด์ฅ๋ฉ๋๋ค.
๋ค์์ ์์ tryhard
ํต๊ณ์
๋๋ค. ์ด๊ฒ์ ๊ฐ๋ณ๊ฒ ๊ฒ์ฆ๋ ๊ฒ์ด๋ฏ๋ก ์์ ๋กญ๊ฒ ์ค๋ฅ๋ฅผ ์ง์ ํด ์ฃผ์ญ์์ค. ;-)
๋ค์์ ์๋ ํ๋ณด ๋ฐฑ๋ถ์จ๋ก ์ ๋ ฌ๋ https://godoc.org ์ ์ฒ์ 20๊ฐ์ ์ธ๊ธฐ ํจํค์ง์ ํด๋นํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ์
๋๋ค. ์ด๊ฒ์ ์ด๋ก ์ vendor
๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธํด์ผ ํ๋ ๊ธฐ๋ณธ tryhard
์ค์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด 20๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์๋ ํ๋ณด์ ์ค์๊ฐ์ 58%์ ๋๋ค.
| ํ๋ก์ ํธ | ์์น | ๋ง์ฝ stmts | if != nil(๋ง์ผ์ %) | ํ๋ณด ์๋(if != nil์ %) |
|---------|-----|---------------|------ -----|---------------
| github.com/google/uuid | 1714 | 12 | 16.7% | 0.0% |
| github.com/pkg/errors | 1886 | 10 | 0.0% | 0.0% |
| github.com/aws/aws-sdk-go | 1911309 | 32015 | 9.4% | 8.9% |
| github.com/jinzhu/gorm | 15246 | 44 | 11.4% | 20.0% |
| github.com/robfig/cron | 1911๋
| 20 | 35.0% | 28.6% |
| github.com/gorilla/websocket | 6959 | 212 | 32.5% | 39.1% |
| github.com/dgrijalva/jwt-go | 3270 | 118 | 29.7% | 40.0% |
| github.com/gomodule/redigo | 7119 | 187 | 34.8% | 41.5% |
| github.com/unixpickle/kahoot-hack | 1743 | 52 | 75.0% | 43.6% |
| github.com/lib/pq | 13396 | 239 | 30.1% | 55.6% |
| github.com/sirupsen/logrus | 5063 | 29 | 17.2% | 60.0% |
| github.com/prometheus/client_golang | 17791 | 194 | 49.0% | 62.1% |
| github.com/go-redis/redis | 21182 | 326 | 42.6% | 73.4% |
| github.com/mongodb/mongo-go-driver | 86605 | 2097 | 37.8% | 73.9% |
| github.com/uber-go/zap | 15363 | 84 | 36.9% | 74.2% |
| github.com/golang/protobuf | 42959 | 685 | 22.9% | 77.1% |
| github.com/gin-gonic/gin | 14574 | 96 | 53.1% | 86.3% |
| github.com/go-pg/pg | 26369 | 831 | 37.7% | 86.9% |
| github.com/Shopify/sarama | 36427 | 1369 | 68.2% | 91.0% |
| github.com/stretchr/testify | 13496 | 32 | 43.8% | 92.9% |
" if stmts " ์ด์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์์ if
๋ฌธ๋ง ์ง๊ณํฉ๋๋ค. ์ด๊ฒ์ด tryhard
๊ฐ ๋ณด๊ณ ํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ gorm
์ ๊ฐ์ ํญ๋ชฉ์ ๋ํด ์ ๊ทธ๋ ๊ฒ ๋ฎ์์ง ์ค๋ช
ํฉ๋๋ค.
godoc.org์์ ์ธ๊ธฐ ์๋ ํจํค์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ผ๋ถ ๋ ํฐ ํ๋ก์ ํธ์ ๋ํ ํต๊ณ๋ ํ์ธํ๊ณ ์ถ์์ต๋๋ค.
์ด๊ฒ๋ค์ ๊ธฐํ์ ๋๋ค. ๋์๊ฒ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅธ ๋๊ท๋ชจ ํ๋ก์ ํธ(์ฆ, ์ด 10๊ฐ ๋ค์ ์ค์ ๋ ผ๋ฆฌ๊ฐ ์์). ์ด๊ฒ์ ๋ค์ ์๋ ํ๋ณด ๋ฐฑ๋ถ์จ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
์ด 10๊ฐ ์ ์ฅ์์์ ์๋ ํ๋ณด์ ์ค์๊ฐ์ 59%์ ๋๋ค.
| ํ๋ก์ ํธ | ์์น | ๋ง์ฝ stmts | if != nil(๋ง์ผ์ %) | ํ๋ณด ์๋(if != nil์ %) |
|---------|-----|---------------|------ ---|---------------------------------|
| github.com/juju/juju | 1026473 | 26904 | 51.9% | 17.5% |
| github.com/go-kit/kit | 38949 | 467 | 57.0% | 51.9% |
| github.com/boltdb/bolt | 12426 | 228 | 46.1% | 53.3% |
| github.com/hashicorp/consul | 249369 | 5477 | 47.6% | 54.5% |
| github.com/docker/docker | 251152 | 8690 | 48.7% | 56.8% |
| github.com/istio/istio | 429636 | 7564 | 40.4% | 61.9% |
| github.com/gohugoio/hugo | 94875 | 1853 | 42.4% | 64.8% |
| github.com/etcd-io/etcd | 209603 | 4657 | 38.3% | 65.5% |
| github.com/kubernetes/kubernetes | 1789172 | 40289 | 43.3% | 66.5% |
| github.com/cockroachdb/cockroach | 1038529 | 22018 | 39.9% | 74.0% |
๋ฌผ๋ก ์ด ๋ ํ ์ด๋ธ์ ์คํ ์์ค ํ๋ก์ ํธ์ ์ํ์ผ ๋ฟ์ด๋ฉฐ ํฉ๋ฆฌ์ ์ผ๋ก ์ ์๋ ค์ง ํ๋ก์ ํธ์ผ ๋ฟ์ ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ๊ฐ์ธ ์ฝ๋ ๊ธฐ๋ฐ์ด ๋ ํฐ ๋ค์์ฑ์ ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์ด๋ก ํํ๋ ๊ฒ์ ๋ณด์๊ณ ๋ค์ํ ์ฌ๋๋ค์ด ๊ฒ์ํ ์ซ์ ์ค ์ผ๋ถ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ด๋ ์ผ๋ถ ์ฆ๊ฑฐ๊ฐ ์์ต๋๋ค.
@thepudds , "๋น ์๋ ํ๋ณด"๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฅ ์ต๊ทผ์ _tryhard_์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
@networkimprov ์ ์ด๋ gorm
์ ๋ํด์๋ ์ด๊ฒ์ด ์ต๊ทผ tryhard
์ ๊ฒฐ๊ณผ์์ ํ์ธํ ์ ์์ต๋๋ค. "๋น์๋ ํ๋ณด"๋ ๋จ์ํ ์์ ํ์ ๋ณด๊ณ ๋์ง ์์ต๋๋ค.
@daved ๋จผ์ , ๋๋/์ฐ๋ฆฌ๊ฐ ๋น์ ์ ๋ชฉ์๋ฆฌ๋ฅผ ํฌ๊ณ ๋๋ ทํ๊ฒ ๋ฃ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ์ด๊ธฐ ๋จ๊ณ์ด๊ณ ๋ง์ ๊ฒ์ด ๋ฐ๋ ์ ์์ต๋๋ค. ์ด์ ์ ํํ์ง ๋ง์๋ค.
๋ฐ๋์ ๊ฐ๋ฅด์น ๋ ์ข ๋ ๋ณด์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๊ณ ์ถ์ ์๋ ์๋ค๋ ์ ์ ์ดํดํ๊ณ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ์ฌ ํด์.
@griesemer ์ฐธ๊ณ ๋ก ์ ๊ฐ ์ฐธ์ฌํ 233k ๋ผ์ธ์ ์ฝ๋์์ ์ต์ ๋ฒ์ ์ tryhard๋ฅผ ์คํํ ๊ฒฐ๊ณผ์ ๋๋ค. ๋๋ถ๋ถ์ ์คํ ์์ค๊ฐ ์๋๋๋ค.
--- stats ---
8760 (100.0% of 8760) functions (function literals are ignored)
2942 ( 33.6% of 8760) functions returning an error
22991 (100.0% of 22991) statements in functions returning an error
5548 ( 24.1% of 22991) if statements
2929 ( 52.8% of 5548) if <err> != nil statements
163 ( 5.6% of 2929) try candidates
0 ( 0.0% of 2929) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
2213 ( 75.6% of 2929) { return ... zero values ..., expr }
167 ( 5.7% of 2929) single statement then branch
253 ( 8.6% of 2929) complex then branch; cannot use try
14 ( 0.5% of 2929) non-empty else branch; cannot use try
๋๋ถ๋ถ์ ์ฝ๋๋ ๋ค์๊ณผ ์ ์ฌํ ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
if err != nil {
return ... zero values ..., errors.Wrap(err)
}
tryhard
๊ฐ ํจ์์ ๋ชจ๋ ํํ์์ด ๋์ผํ ํํ์์ ์ฌ์ฉํ๋ ๋๋ฅผ ์๋ณํ ์ ์๋ค๋ฉด ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค. ์ฆ, ๋จ์ผ ๊ณตํต defer
์ฒ๋ฆฌ๊ธฐ๋ก ํจ์๋ฅผ ๋ค์ ์์ฑํ ์ ์๋ ๊ฒฝ์ฐ์
๋๋ค.
๋ค์์ ์ฌ์ฉ์ ๋ฐ ํ๋ก์ ํธ ์์ฑ์ ์๋ํํ๋ ์์ GCP ๋์ฐ๋ฏธ ๋๊ตฌ์ ๋ํ ํต๊ณ์ ๋๋ค.
$ tryhard -r .
--- stats ---
129 (100.0% of 129) functions (function literals are ignored)
75 ( 58.1% of 129) functions returning an error
725 (100.0% of 725) statements in functions returning an error
164 ( 22.6% of 725) if statements
93 ( 56.7% of 164) if <err> != nil statements
64 ( 68.8% of 93) try candidates
0 ( 0.0% of 93) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
17 ( 18.3% of 93) { return ... zero values ..., expr }
7 ( 7.5% of 93) single statement then branch
1 ( 1.1% of 93) complex then branch; cannot use try
0 ( 0.0% of 93) non-empty else branch; cannot use try
๊ทธ๋ฐ ๋ค์ ๊ณ์ํด์ err
๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋์ ๋ชจ๋ ์์น๋ฅผ ํ์ธํ์ฌ ์๋ฏธ ์๋ ํจํด์ ์ฐพ์ ์ ์๋์ง ํ์ธํ์ต๋๋ค.
err
์์ง๋ช ๊ณณ์์๋ ์ฒซ ๋ฒ์งธ ์ค๋ฅ์์ ์คํ์ ์ค์งํ์ง ์๊ณ ๋์ ์คํ์ด ๋๋ ๋ ํ ๋ฒ ๋ฐ์ํ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. try
์ ์ ํตํฉ๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๊ฑฐ๋ Go ์์ฒด์ ๋ค์ค ์ค๋ฅ ์ง์์ด ์ถ๊ฐ๋์์ ์ ์์ต๋๋ค.
var errs []error
for _, p := range toDelete {
fmt.Println("delete:", p.ProjectID)
if err := s.DeleteProject(ctx, p.ProjectID); err != nil {
errs = append(errs, err)
}
}
์ด ๋๊ธ ์ ๋ค์ ์ฝ์ ํ ๊ฐ์๊ธฐ ๋ง์ ์ ์ฌ์ ์ธ try
์ผ์ด์ค๊ฐ ์ ์ฃผ์๋ฅผ ๋์์ต๋๋ค. ํธ์ถ ํจ์๊ฐ ํธ์ถ๋ ํจ์๊ฐ ์ด๋ฏธ ์ค๋ฅ์ ์ถ๊ฐํ์ ์ ์๋ ์ ๋ณด๋ก ํธ์ถ๋ ํจ์์ ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ค๋ ์ ์์ ๋ชจ๋ ์ ์ฌํฉ๋๋ค.
func run() error {
key := "MY_ENV_VAR"
client, err := ClientFromEnvironment(key)
if err != nil {
// "github.com/pkg/errors"
return errors.Wrap(err, key)
}
// do something with `client`
}
func ClientFromEnvironment(key string) (*http.Client, error) {
filename, ok := os.LookupEnv(key)
if !ok {
return nil, errors.New("environment variable not set")
}
return ClientFromFile(filename)
}
๋ช ํ์ฑ์ ์ํด ์ฌ๊ธฐ์์ Go ๋ธ๋ก๊ทธ ์ ์ค์ํ ๋ถ๋ถ์ ๋ค์ ์ธ์ฉํฉ๋๋ค.
์ปจํ ์คํธ๋ฅผ ์์ฝํ๋ ๊ฒ์ ์ค๋ฅ ๊ตฌํ์ ์ฑ ์์ ๋๋ค. os.Open์์ ๋ฐํํ ์ค๋ฅ๋ "permission denied"๊ฐ ์๋๋ผ "open /etc/passwd: ๊ถํ ๊ฑฐ๋ถ๋จ" ํ์์ผ๋ก ํ์๋ฉ๋๋ค. Sqrt์์ ๋ฐํํ ์ค๋ฅ์๋ ์๋ชป๋ ์ธ์์ ๋ํ ์ ๋ณด๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ์์ ์ฝ๋๋ ์ด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func run() error {
key := "MY_ENV_VAR"
client := try(ClientFromEnvironment(key))
// do something with `client`
}
func ClientFromEnvironment(key string) (*http.Client, error) {
filename, ok := os.LookupEnv(key)
if !ok {
return nil, fmt.Errorf("environment variable not set: %s", key)
}
return ClientFromFile(filename)
}
์ธ๋ป ๋ณด๊ธฐ์ ์ด๊ฒ์ ์ฌ์ํ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ด ์ถ์ ์ ๋ฐ๋ฅด๋ฉด try
๊ฐ ์ค์ ๋ก ๋ ์ฐ์ํ๊ณ ์ผ๊ด๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ฅ ์ฒด์ธ๊ณผ ์์ค ๋๋ ํจํค์ง์ ๋ ๊ฐ๊น๊ฒ ํธ์ํ๋๋ก ์ฅ๋ คํ๊ณ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก try
๊ฐ ์ฅ๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฐ์น๋ ํ์ฌ ๋ด๊ฐ ๋ณด๊ณ ์๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ณด๋ค ๋ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
try
๊ฐ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํจ์ ๋ฐ๋ผ ํค์๋๊ฐ "๋๋"์ด ๋ ์ข์ ์ ์์ต๋๋ค.try
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ด์ return err
์ผ์ด์ค์ ๋๋ฒ๊ทธ ์คํ ํผ๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค.์ด๋ฌํ ์ฐ๋ ค๋ ์ด๋ฏธ ๋ฐ๋ ํ์ ์๋ ค์ ธ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด "ํ์ค ์ธ๊ณ"์์ ์ด๋ป๊ฒ ์งํ๋ ์ง ๊ถ๊ธํฉ๋๋ค. ์๊ฐ์ ๋ด์ด ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ์๋ตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด์ ์ error
๋ฅผ ๋ฐํํ์ง ์๋ ํจ์ ์๋ช
์ ์์ ํ์ต๋๋ค. @magical ์ฐพ์์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
func main() { key := "MY_ENV_VAR" client := try(ClientFromEnvironment(key)) // do something with `client` }
@mrkanister Nitpicking , ํ์ง๋ง main
๊ฐ error
๋ฅผ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ์์๋ ์ค์ ๋ก try
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ฌ ๋๊ธ์
๋๋ค.
์ ์ ๊ฐ๊พธ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ๋ํด @griesemer ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ณณ์์๋ ํ๊ณ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค์ด ๋ง์ ๊ฒฝ์ฐ(https://github.com/golang/go/issues/32437#issuecomment-509974901):
if !ok {
return nil, fmt.Errorf("environment variable not set: %s", key)
}
์ผ๋ถ ์กฐ๊ฑด์ด true์ธ ๊ฒฝ์ฐ์๋ง nil์ด ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
try(condErrorf(!ok, "environment variable not set: %s", key))
๊ณตํต ํจํด์ด ์๋ณ๋๋ฉด ์ฒ์์๋ ํจํค์ง ์์ค์์, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ฌํ ์ ์์ต๋๋ค. Tryhard๋ ํ๋ฅญํ๊ณ ํ๋ฅญํ ์ผ์ ํ๊ณ ์์ผ๋ฉฐ ํฅ๋ฏธ๋ก์ด ์ ๋ณด๋ฅผ ๋ง์ด ์ ๊ณตํ์ง๋ง ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ์์ต๋๋ค.
@zeebo ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ํ ์ค if ์ ์์ ์ถ๊ฐํ์ฌ if ๋ฌธ์ != nil
๋ฐ ์ค๊ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฐ๊ฒฐํ ํ์์ ๊ฐ์ง ์ ์์ต๋๋ค.
if err return err
if err return errors.Wrap(err, "foo: failed to boo")
if err return fmt.Errorf("foo: failed to boo: %v", err)
๋๋ ์ด๊ฒ์ด ๊ฐ๋จํ๊ณ ๊ฐ๋ณ๊ณ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
if variable return ...
์ ๋ํ ์ง์์ ์ถ๊ฐํฉ๋๋ค. return
๊ฐ ์ผ์ชฝ์ ๋๋ฌด ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ํ์ด๋ณด๊ธฐ๊ฐ ์ฌ์ ํ ๋งค์ฐ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ํ ์ค ifs(?) Go๋ ๋ํ if ๋ฌธ์์ ๊ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๊ตฌ๋ฌธ์ ๋จ์ํํ ์ ๋ก๋ฅผ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ต๋๋ค.ํ์ฌ ์คํ์ผ:
a, err := BusinessLogic(state)
if err != nil {
return nil, err
}
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํ ์ค๋ก ํ์๋ฉ๋๋ค.
a, err := BusinessLogic(state)
if err != nil { return nil, err }
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํ ์ค ์์ถ:
a, err := BusinessLogic(state)
if err return nil, err
a, err := BusinessLogic(state)
if err return nil, errors.Wrap(err, "some context")
func (c *Config) Build() error {
pkgPath, err := c.load()
if err return nil, errors.WithMessage(err, "load config dir")
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err return nil, errors.WithMessage(err, "execute main template")
buf, err := format.Source(b.Bytes())
if err return nil, errors.WithMessage(err, "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err return nil, errors.WithMessagef(err, "write file %s", target)
// ...
}
@eug48 #32611 ์ฐธ์กฐ
๋ค์์ monorepo์ ๋ํ ์๊ฒฉํ ํต๊ณ์ ๋๋ค(๊ณต๊ธ์ ์ฒด ์ฝ๋๋ฅผ ์ ์ธํ go ์ฝ๋ ์ค: 2,282,731):
--- stats ---
117551 (100.0% of 117551) functions (function literals are ignored)
35726 ( 30.4% of 117551) functions returning an error
263725 (100.0% of 263725) statements in functions returning an error
50690 ( 19.2% of 263725) if statements
25042 ( 49.4% of 50690) if <err> != nil statements
12091 ( 48.3% of 25042) try candidates
36 ( 0.1% of 25042) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
3561 ( 14.2% of 25042) { return ... zero values ..., expr }
3304 ( 13.2% of 25042) single statement then branch
4966 ( 19.8% of 25042) complex then branch; cannot use try
296 ( 1.2% of 25042) non-empty else branch; cannot use try
์ฌ๋๋ค์ด ์ฌ์ ํ ๋์์ ์ ์ํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ ๊ด๋ฒ์ํ Go ์ปค๋ฎค๋ํฐ๊ฐ ์ ์๋ ์๋ก์ด ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์์ ์ค์ ๋ก ์ํ๋ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ๋ ์์ธํ ์๊ณ ์ถ์ต๋๋ค.
๋๋ ์ฌ๋๋ค์ด ์ ์ํ๋ ๊ฒ์ ๋ณธ ๋ง์ ๋ค๋ฅธ ๊ธฐ๋ฅ, ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋์ดํ๋ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ ์ ์คํ๊ฒ _์ ์๋ ์ด๋ฆ์ด๋ ๊ตฌ๋ฌธ์ ์๋ตํ์ต๋๋ค_. ๋ฌผ๋ก ๋ด ์์ ์ ์๊ฒฌ์ ์ ํธํ๊ธฐ๋ณด๋ค๋ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ์ค๋ฆฝ์ ์ผ๋ก ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
์ฌ๋๋ค์ด ์ฐธ์ฌํ๊ณ ์ถ๋ค๋ฉด ๊ณต์ ํ๊ธฐ ์ํด ์ค์ธ ๋งํฌ๊ฐ ์์ต๋๋ค.
https://forms.gle/gaCBgxKRE4RMCz7c7
์ฐธ์ฌํ๋ ๋ชจ๋ ์ฌ๋์ด ์์ฝ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ํ ๋ก ์ ์ง์คํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๊น?
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
์ด ๊ฒฝ์ฐ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ์ง์ฐ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์๋ํ์ง ์๊ฑฐ๋ ์๋ํฉ๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉด ๋ ์ ๋ณด์ด๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํนํ ์ด๊ฒ์ด ์ง๊ธ๊น์ง ํ์ค์ผ๋ก ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ try
์๊ฐํด์ฃผ์ธ์. ์ฌ๊ธฐ์์๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฐพ์์ต๋๋ค.
--- stats ---
929 (100.0% of 929) functions (function literals are ignored)
230 ( 24.8% of 929) functions returning an error
1480 (100.0% of 1480) statements in functions returning an error
320 ( 21.6% of 1480) if statements
206 ( 64.4% of 320) if <err> != nil statements
109 ( 52.9% of 206) try candidates
2 ( 1.0% of 206) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
53 ( 25.7% of 206) { return ... zero values ..., expr }
18 ( 8.7% of 206) single statement then branch
17 ( 8.3% of 206) complex then branch; cannot use try
2 ( 1.0% of 206) non-empty else branch; cannot use try
@lpar ๋์ ์ ๋ํด ๋
ผ์ํ ์ ์์ง๋ง ์ด ๋ฌธ์ ์์๋ ํ์ง ๋ง์ญ์์ค. try
์ ์์ ๊ดํ ๊ฒ์
๋๋ค. ๊ฐ์ฅ ์ข์ ์ฅ์๋ ์ค์ ๋ก ๋ฉ์ผ๋ง ๋ฆฌ์คํธ(์: go-nuts) ์ค ํ๋์
๋๋ค. ๋ฌธ์ ์ถ์ ๊ธฐ๋ ์ผ๋ฐ์ ์ธ ํ ๋ก ๋ณด๋ค ํน์ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ณ ํ ๋ก ํ๋ ๋ฐ ์ ๋ง ์ ํฉํฉ๋๋ค. ๊ฐ์ฌ ํด์.
@fabstu defer
ํธ๋ค๋ฌ๋ try
์ ๋ฌด์ ๊ด๊ณ์์ด ๊ทํ์ ์์ ์์ ์ ์๋ํฉ๋๋ค. ๋๋ฌ์ธ๋ ๊ธฐ๋ฅ์ผ๋ก ์ฝ๋ ํ์ฅ:
func f() (err error) {
defer func() {
if err != nil {
err = decorate(err, "msg") // here you can modify the result error as you please
}
}()
...
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
...
}
(๊ฒฐ๊ณผ err
๋ return err
์ ์ํด ์ค์ ๋๊ณ return
err
#$๋ if
- ์ด๊ฒ์ ์๋ ์ค์ธ ์ผ๋ฐ์ ์ธ ๋ฒ์ ์ง์ ๊ท์น์ผ ๋ฟ์
๋๋ค.
๋๋ try
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ err
๋ณ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
func f() (err error) {
defer func() {
if err != nil {
err = decorate(err, "msg") // here you can modify the result error as you please
}
}()
...
try(os.Setenv("GO111MODULE", "on"))
...
}
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ ์๋ errors/errd
ํจ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
func f() (err error) {
defer errd.Wrap(&err, ... )
...
try(os.Setenv("GO111MODULE", "on"))
...
}
๋ํ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
func f() error {
...
try(os.Setenv("GO111MODULE", "on"))
...
}
@fastu ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก try
errors/errd
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์ ์ป์ ์ ์์ต๋๋ค.
func f() (err error) {
defer errd.Wrap(&err, ... )
...
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
...
}
์๊ฐํ ์๋ก ์ด ์ ์์ด ๋ง์์ ๋ญ๋๋ค.
๋๋ฅผ ๋ฐฉํดํ๋ ์ ์ผํ ๊ฒ์ ๋ช
๋ช
๋ ๋ฐํ์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๋ง์นจ๋ด ์ข์ ์ต๊ด์ด๊ณ ์ฌ์ฉํด์ผ ํฉ๋๊น(์๋ํ์ง ์์)?
์ด์จ๋ , ๋ด ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๊ทธ๋ ๊ฒ ์๋ํฉ๋๊น?
func f() error {
var err error
defer errd.Wrap(&err,...)
try(...)
}
@flibustenet ๋ช
๋ช
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์ ์์ฒด๋ ๋์ ์ต๊ด์ด ์๋๋๋ค. ๋ช
๋ช
๋ ๊ฒฐ๊ณผ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ฐ๋ ค๋ naked returns
์ ํ์ฑํํ๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, return
_์ ํจ๊ป ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํ ํ์ ์์ด return
๋ฅผ ๊ฐ๋จํ ์์ฑํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก(ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค!) ์ด๋ฌํ ๊ดํ์ return
๋ฌธ์ ๋ณด๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ถ๋ก ํ๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ ๋ํ ์ฝ๋๋ฅผ ์ค์บํด์ผ ํฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฐ ๋ฑ์ ์ค์ ํ๋ ๊ฒ์ ๋์น ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ผ๋ถ ์ฝ๋ ๊ธฐ๋ฐ์์๋ ๋จ์ ๋ฐํ์ด ๊ถ์ฅ๋์ง ์์ต๋๋ค.
ํ์ง๋ง ์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ ์ค๋ฅ ๋ฐ์ ์ ๊ฒฐ๊ณผ๊ฐ ์ ํจํ์ง ์๋ค๋ฉด ์ค๋ฅ๋ฅผ ์ค์ ํ๊ณ ๋๋จธ์ง๋ ๋ฌด์ํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. ์ค๋ฅ ๊ฒฐ๊ณผ๊ฐ ์ผ๊ด๋๊ฒ ์ค์ ๋๋ ํ ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ค์ดํค๋ ๋ฆฌํด์ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค. try
๋ ์ ํํ ๊ทธ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ช
๋ช
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ defer
๋ก ์ค๋ฅ ๋ฐํ์ ์ฆ๋ํ๋ ค๋ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค. ์ค๊ณ ๋ฌธ์ ๋ ๋ํ ์ค๋ฅ ๊ฒฐ๊ณผ์ ์ก์ธ์คํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ ๊ณตํ ๊ฐ๋ฅ์ฑ์ ๋ํด์๋ ๊ฐ๋ตํ๊ฒ ์ค๋ช
ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ช
๋ช
๋ ๋ฐํ์ด ํ์ํ์ง ์์ต๋๋ค.
์ฝ๋ ์์ ์ ๊ด๋ จํ์ฌ: try
_always_๊ฐ _result error_(์ด ๊ฒฝ์ฐ ์ด๋ฆ ์์)๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ์์๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ง์ญ ๋ณ์ err
๋ฅผ ์ ์ธํ๊ณ ์๊ณ errd.Wrap
๋ ๊ทธ ๋ณ์์์ ์๋ํฉ๋๋ค. try
๋ก ์ค์ ๋์ง ์์ต๋๋ค.
๋น ๋ฅธ ๊ฒฝํ ๋ณด๊ณ ์: ๋ค์๊ณผ ๊ฐ์ HTTP ์์ฒญ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑ ์ค์ ๋๋ค.
func Handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
id := chi.URLParam(r, "id")
var err error
// starts as bad request, then it's an internal server error after we parse inputs
var statusCode = http.StatusBadRequest
defer func() {
if err != nil {
wrap := xerrors.Errorf("handler fail: %w", err)
logger.With(zap.Error(wrap)).Error("error")
http.Error(w, wrap.Error(), statusCode)
}
}()
var c Thingie
err = unmarshalBody(r, &c)
if err != nil {
return
}
statusCode = http.StatusInternalServerError
s, err := DoThing(ctx, c)
if err != nil {
return
}
d, err := DoThingWithResult(ctx, id, s)
if err != nil {
return
}
data, err := json.Marshal(detail)
if err != nil {
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
_, err = w.Write(data)
if err != nil {
return
}
}
์ธ๋ป ๋ณด๊ธฐ์ ์ด๊ฒ์ try
์ ๋ํ ์ด์์ ์ธ ํ๋ณด์ฒ๋ผ ๋ณด์
๋๋ค. ์๋ํ๋ฉด ๋ฉ์์ง๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ ์ธ์๋ ํ ์ผ์ด ์๋ ๋ง์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ๋ชจ๋ ์์
์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ ์ฒ๋ฆฌ๊ธฐ๊ฐ error
๋ฅผ ๋ฐํํ์ง ์๊ธฐ ๋๋ฌธ์ try
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ค๋ฉด func() error
์๋ช
์ด ์๋ ํด๋ก์ ๋ก ๋ณธ๋ฌธ์ ๊ฐ์ธ์ผ ํฉ๋๋ค. ๊ทธ ๋๋์...์ฐ์ํ๊ณ ์ด๋ฐ ์ฝ๋๊ฐ ๋ค์ ์ผ๋ฐ์ ์ธ ํจํด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@jonbodner
์ด๊ฒ์ ์๋ํฉ๋๋ค(https://play.golang.org/p/NaBZe-QShpu):
package main
import (
"errors"
"fmt"
"golang.org/x/xerrors"
)
func main() {
var err error
defer func() {
filterCheck(recover())
if err != nil {
wrap := xerrors.Errorf("app fail (at count %d): %w", ct, err)
fmt.Println(wrap)
}
}()
check(retNoErr())
n, err := intNoErr()
check(err)
n, err = intErr()
check(err)
check(retNoErr())
check(retErr())
fmt.Println(n)
}
func check(err error) {
if err != nil {
panic(struct{}{})
}
}
func filterCheck(r interface{}) {
if r != nil {
if _, ok := r.(struct{}); !ok {
panic(r)
}
}
}
var ct int
func intNoErr() (int, error) {
ct++
return 0, nil
}
func retNoErr() error {
ct++
return nil
}
func intErr() (int, error) {
ct++
return 0, errors.New("oops")
}
func retErr() error {
ct++
return errors.New("oops")
}
์, ์ฒซ ๋ฒ์งธ ๋ฐ๋ ํฌํ! ์ข์. ์ค์ฉ์ฃผ์๊ฐ ๋น์ ์ ํตํด ํ๋ฅด๊ฒํ์ญ์์ค.
์ผ๋ถ ์ฝ๋๋ฒ ์ด์ค์์ tryhard
๋ฅผ ์คํํ์ต๋๋ค. ๋ถํํ๋, ๋ด ํจํค์ง ์ค ์ผ๋ถ์๋ ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ๊ตฌํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฝค ํฐ ํจํค์ง์๋ 0
์๋ ํ๋ณด๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋ ๋ด ๋น์ฆ๋์ค ๋
ผ๋ฆฌ ๊ณ์ธต ๋ฉ์๋๋ error
๋์ SanitizedError
๋ง ๋ด๋ณด๋ด๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ์ด๋ ์ปดํ์ผ ์๊ฐ์ ํ์ผ ์์คํ
๊ฒฝ๋ก๋ ์์คํ
์ ๋ณด์ ๊ฐ์ ๊ฒ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๊ธฐ ์ํจ์
๋๋ค. ์ค๋ฅ ๋ฉ์์ง์์ ์ฌ์ฉ์์๊ฒ ๋์ถ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ด ํจํด์ ์ฌ์ฉํ๋ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
func (a *App) GetFriendsOfUser(userId model.Id) ([]*model.User, SanitizedError) {
if user, err := a.GetUserById(userId); err != nil {
// (*App).GetUserById returns (*model.User, SanitizedError)
// This could be a try() candidate.
return err
} else if user == nil {
return NewUserError("The specified user doesn't exist.")
}
friends, err := a.Store.GetFriendsOfUser(userId)
// (*Store).GetFriendsOfUser returns ([]*model.User, error)
// This could be a SQL error or a network error or who knows what.
return friends, NewInternalError(err)
}
๋๋ฌ์ธ๋ ํจ์์ try ํจ์ ํํ์์ ๋ง์ง๋ง ๋ฐํ ๊ฐ์ด ๋ชจ๋ ์ค๋ฅ๋ฅผ ๊ตฌํํ๊ณ ๋์ผํ ์ ํ์ธ ํ ํ์ฌ ์ ์์ ์ํํ ์ ์๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ์ฒด์ ์ธ nil -> ์ธํฐํ์ด์ค ํผ๋์ ํผํ ์ ์์ง๋ง ์์ ๊ฐ์ ์ํฉ์์๋ try๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@jonbodner๋ , ์๋ฅผ ๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค(๋ฒ์ญ ์ค๋ฅ์๋ ๋ถ๊ตฌํ๊ณ ).
func Handler(w http.ResponseWriter, r *http.Request) {
statusCode, err := internalHandler(w, r)
if err != nil {
wrap := xerrors.Errorf("handler fail: %w", err)
logger.With(zap.Error(wrap)).Error("error")
http.Error(w, wrap.Error(), statusCode)
}
}
func internalHandler(w http.ResponseWriter, r *http.Request) (statusCode int, err error) {
ctx := r.Context()
id := chi.URLParam(r, "id")
// starts as bad request, then it's an internal server error after we parse inputs
statusCode = http.StatusBadRequest
var c Thingie
try(unmarshalBody(r, &c))
statusCode = http.StatusInternalServerError
s := try(DoThing(ctx, c))
d := try(DoThingWithResult(ctx, id, s))
data := try(json.Marshal(detail))
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
try(w.Write(data))
return
}
๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง๋ง ํจ์ฌ ๋ ์งง์ต๋๋ค(29์ค ๋ 40์ค). ๊ทธ๋ฆฌ๊ณ ์ข์ ๊ฐ๊ฒฉ์ ์ฌ์ฉํ์ต๋๋ค. ์ด ์ฝ๋์๋ defer
๊ฐ ํ์ํ์ง ์์ต๋๋ค. ํนํ defer
๋ ๋ด๋ ค๊ฐ๋ฉด์ defer
์์ ์ฌ์ฉ๋๋ statusCode์ ํจ๊ป ์๋ณธ ์ฝ๋๋ฅผ ํ์ ์ด์์ผ๋ก ๋ฐ๋ผ๊ฐ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ ์ฝ๋๋ ๋ช
๋ช
๋ ๊ฒฐ๊ณผ์ ๊ธฐ๋ณธ ๋ฐํ์ ์ฌ์ฉํ์ง๋ง(์ํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ return statusCode, nil
๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์) "๋น์ฆ๋์ค ๋ก์ง"์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ ํ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ๋จํฉ๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ์ ๋ด ์๊ฒฌ์ ๋ค์ ๊ฒ์ํ์ญ์์ค. https://github.com/golang/go/issues/32853#issuecomment -510340544
๋ค๋ฅธ ๋งค๊ฐ๋ณ์ funcname
๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ ํ ์ด๋ค ํจ์์์ ์ค๋ฅ๊ฐ ๋ฐํ๋๋์ง ์ ์ ์์ต๋๋ค.
func foo() error {
handler := func(err error, funcname string) error {
return fmt.Errorf("%s: %v", funcname, err) // wrap something
//return nil // or dismiss
}
a, b := try(bar1(), handler)
c, d := try(bar2(), handler)
}
@ccbrown ๊ทํ์ ์๊ฐ ์์ ๋์ผํ ์ทจ๊ธ์ ๋ฐ์ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฆ, ๋ด๋ถ ์ค๋ฅ๊ฐ ๋๊ฐ๊ธฐ ์ ์(๋๋ฌ์ธ๋ ํจ์์ ์ํด) ํ ๋ฒ(๋๋ฌ์ธ๋ ํจ์์ ์ํด) ๋ํ๋๋๋ก ์ฝ๋๋ฅผ ์ธ์๋ถํดํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ฉด(์ด๋์๋ ๋ํํ๊ธฐ ๋ณด๋ค๋). (์์คํ ์ ๋ํด ๋ง์ด ์์ง ๋ชปํจ) ๋์๊ฒ ๊ทธ๊ฒ์ ๋ชจ๋ ๊ณณ์ด ์๋ ํ ๊ณณ์์ ์ค๋ฅ ๋ํ์ ์ค์ ์ง์คํํ๋ฏ๋ก ๋ฐ๋์งํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์ง๋ฌธ๊ณผ ๊ด๋ จํ์ฌ: try
๊ฐ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์ ํ์ ํ์ฉํ๋๋ก(๊ทธ๋ฆฌ๊ณ ํ๋๋ฅผ ๋ฐํํ๋๋ก) ์๊ฐํด์ผ ํฉ๋๋ค. ํ์ฌ๋ก์๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์ค๋ช
ํ๊ธฐ๊ฐ ๋ ๋ณต์กํ๋ค๋ ์ ๋ง ์ ์ธํ๊ณ ). ํ์ง๋ง ๊ฒฐ๊ตญ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค.
๊ทธ ๋ผ์ธ์ ๋ฐ๋ผ, ์ฐ๋ฆฌ๋ ์ด๊ธฐ์ try
๊ฐ ์ผ๋ฐํ๋์ด error
์ ํ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ ํ์ ๋ํด ์๋ํ๋์ง ๊ถ๊ธํ๊ณ err != nil
ํ
์คํธ๋ ๊ทธ๋ฌ๋ฉด x != zero
๊ฐ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ x
๋ err
(๋ง์ง๋ง ๊ฒฐ๊ณผ)์ ํด๋นํ๊ณ zero
๋ x
์ ํ์ ๋ํ ๊ฐ๊ฐ์ 0 ๊ฐ์
๋๋ค. bool
์ 0 ๊ฐ์ด false
์ด๊ณ ok != false
๊ฐ ์ ํํ ํ
์คํธํ๋ ค๋ ๊ฒ๊ณผ ๋ฐ๋์
๋๋ค.
@lunny ์ ์๋ try
๋ฒ์ ์ ํธ๋ค๋ฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ง ์์ต๋๋ค.
@griesemer ์ค. ์ํ๊น์ ๋ผ! ๊ทธ๋ ์ง ์์ผ๋ฉด github.com/pkg/errors
๋ฐ ๋ชจ๋ errors.Wrap
๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
@ccbrown ๊ทํ์ ์๊ฐ ์์ ๋์ผํ ์ทจ๊ธ์ ๋ฐ์ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฆ, ๋ด๋ถ ์ค๋ฅ๊ฐ ๋๊ฐ๊ธฐ ์ ์(๋๋ฌ์ธ๋ ํจ์์ ์ํด) ํ ๋ฒ(๋๋ฌ์ธ๋ ํจ์์ ์ํด) ๋ํ๋๋๋ก ์ฝ๋๋ฅผ ์ธ์๋ถํดํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ฉด(์ด๋์๋ ๋ํํ๊ธฐ ๋ณด๋ค๋). (์์คํ ์ ๋ํด ๋ง์ด ์์ง ๋ชปํจ) ๋์๊ฒ ๊ทธ๊ฒ์ ๋ชจ๋ ๊ณณ์ด ์๋ ํ ๊ณณ์์ ์ค๋ฅ ๋ํ์ ์ค์ ์ง์คํํ๋ฏ๋ก ๋ฐ๋์งํ ๊ฒ ๊ฐ์ต๋๋ค.
@griesemer ๋์ error
๋ฅผ ๋๋ฌ์ธ๋ ํจ์์ ๋ฐํํ๋ฉด ๊ฐ ์ค๋ฅ๋ฅผ ๋ด๋ถ ์ค๋ฅ, ์ฌ์ฉ์ ์ค๋ฅ, ๊ถํ ๋ถ์ฌ ์ค๋ฅ ๋ฑ์ผ๋ก ๋ถ๋ฅํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆด ์ ์์ต๋๋ค. ์๋ ๊ทธ๋๋ก ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ํฌ์ฐฉํ๊ณ try
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
try
์ ๋์์ธ์ด ๋ง์์ ๋ ๋ค๊ณ ๋งํ๊ณ ์ถ์ง๋ง try
๋ฅผ ์ฌ์ฉํ๋ ๋์ defer
ํธ๋ค๋ฌ์ if
๋ฌธ์ด ์ฌ์ ํ ์์ต๋๋ค. try
๋ฐ defer
ํธ๋ค๋ฌ๊ฐ ์๋ $ if
๋ช
๋ น๋ฌธ๋ณด๋ค ๊ฐ๋จํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ try
๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋์ ๊ฒ์
๋๋ค.
@ccbrown ์๊ฒ ์ต๋๋ค. ๋์ด์ผ๋ณด๋ฉด, ๋น์ ์ด ์ ์ํ ํด์์ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ด๋ จ ํ
์คํธ๊ฐ x != nil
๋ก ์ ์ง๋๋ ํ error
๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ(๋ฐ ์ผ์นํ๋ ๊ฒฐ๊ณผ ์ ํ)๊ณผ ํจ๊ป ์๋ํ๋๋ก try
๋ฅผ ์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. . ์๊ฐํด ๋ณผ ๊ฒ์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ๋ฏฟ๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์กฐ๊ธฐ์ ๋๋ ์๊ธํ์ฌ ์ํํ ์ ์์ต๋๋ค.
@jonbodner ์์ ์ @griesemer ๊ฐ ๋ค์ ์์ฑํ ๋ฐฉ์์ ์ ํํ ์ ๊ฐ try
๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ฝ๋ ์ข
๋ฅ์
๋๋ค.
์๋ฌด๋ ์ด๋ฐ ์ ํ์ ์๋๋ฅผ ๊ท์ฐฎ๊ฒ ํ์ง ์์ต๋๋ค:
๋ฐ์ดํฐ := try(json.Marshal(detail))
๋ง์ฌ๋ง ์ค๋ฅ๊ฐ ์์ฑ๋ ์ฝ๋์์ ์ฌ๋ฐ๋ฅธ ์ค์ ์ฐพ๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค๋ ์ฌ์ค์๋ ๋ถ๊ตฌํ๊ณ , ์ด๊ฒ์ด ์ค ๋ฒํธ/ํธ์ถ์ ์ ๋ณด๊ฐ ํฌํจ๋์ง ์์ ์ฑ ๋ฐํ๋๋ ์๋ชธ ์ค๋ฅ๋ผ๋ ๊ฒ์ ์๋ ๊ฒ์ด ๋ถํธํฉ๋๋ค. ์์ค ํ์ผ, ํจ์ ์ด๋ฆ ๋ฐ ์ค ๋ฒํธ๋ฅผ ์๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ๋ ํฌํจํ๋ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์คํดํ๊ณ ์์์ง๋ ๋ชจ๋ฅด์ง๋ง.
@griesemer ์ ๋ ์ฌ๊ธฐ์ ๋์์ ๋ ผ์ํ ๊ณํ์ด ์๋์์ต๋๋ค. ๋ชจ๋๊ฐ ๊ณ์ํด์ ๋์์ ์ ์ํ๋ค๋ ์ฌ์ค์ด ๋ฐ๋ก ์ฌ๋๋ค์ด ์ค์ ๋ก ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ ์ํ ์ค๋ฌธ์กฐ์ฌ๊ฐ ์ข์ ์๊ฐ์ธ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go ์ค๋ฅ ์ฒ๋ฆฌ ๊ฐ์ ๊ฐ๋ฅ์ฑ์ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฅํ ๋ง์ ์ฌ๋๋ค์ ํ์ ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ๋ํด ๊ฒ์ํ์ต๋๋ค.
@trende-jp ์ ๋ ์ด ์ฝ๋ ๋ผ์ธ์ ์ปจํ
์คํธ์ ์์กดํฉ๋๋ค. ๊ทธ ์์ฒด๋ก๋ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ํ๋จํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด json.Marshal
์ ๋ํ ์ ์ผํ ํธ์ถ์ด๊ณ ์ค๋ฅ๋ฅผ ๋๋ฆฌ๋ ค๋ฉด if
๋ฌธ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. json.Marshal
ํธ์ถ์ด ๋ง์ ๊ฒฝ์ฐ $#$3 defer
#$ ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ก์ปฌ ํด๋ก์ ๋ด๋ถ์ ์ด๋ฌํ ๋ชจ๋ ํธ์ถ์ ๋ํํจ์ผ๋ก์จ ๊ฐ๋ฅํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ(์ฆ, ๋์ผํ ํจ์์ ์ด๋ฌํ ํธ์ถ์ด ๋ง์ ๊ฒฝ์ฐ) ์ด๋ฅผ ์ธ์๋ถํดํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. "์ค๋ฅ๋ ๊ฐ์
๋๋ค"๋ ์ฌ๊ธฐ์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ๋ง๋์ญ์์ค.
try
๋ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์๋๊ฐ ์๋๋๋ค. ๋๊ตฌ ์์์ ๋ ๋ค๋ฅธ ๋๊ตฌ์ผ ๋ฟ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ค์ ๋ก ์๋ก์ด ๊ธฐ๊ณ๋ ์๋๋ฉฐ ๊ฑฐ์ 10๋
๋์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ๊ด์ฐฐํ ํจํด์ ๋ํ ์ผ์ข
์ ๊ตฌ๋ฌธ ์คํ์
๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ด๋ค ์ฝ๋์์๋ ์ ๋ง ์ ์๋ํ๊ณ ๋ค๋ฅธ ์ฝ๋์์๋ ๋ณ๋ก ๋์์ด ๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ฆ๊ฑฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
@trende-jp
defer
๋ก ํด๊ฒฐํ ์ ์๋์?
defer fmt.HandleErrorf(&err, "decoding %q", path)
๋ด ๋ธ๋ก๊ทธ: How to use 'try' ์ ๋์ ์๋ ๊ฒ์ฒ๋ผ ์ค๋ฅ ๋ฉ์์ง์ ์ค ๋ฒํธ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
@trende-jp @faiface ์ค ๋ฒํธ ์ธ์๋ ๋ฐ์ฝ๋ ์ดํฐ ๋ฌธ์์ด์ ๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํจํ ํน์ ํจ์ ํธ์ถ์ ๊ฒฉ๋ฆฌํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ ๋์ ์ผ๋ก ๋ด์ฅ ํจ์๊ฐ ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
panic()
๋ฐ recover()
๋ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ๋ช ๋ฒ ์ธ๊ธ๋์์ต๋๋ค. ๋ ์ด์ ์ถ๊ฐํ์ง ๋ง์๋ค.
@networkimprov ๋ https://github.com/golang/go/issues/32437#issuecomment -498960081์ ์์ฑํ์ต๋๋ค.
๊ทธ๊ฒ์ Go์ฒ๋ผ ์ฝ์ง ์์ต๋๋ค.
๋๋ ๋ ๋์ํ ์ ์์๋ค.
์ด๋ค ๊ฒ์ด๋ ๊ทผ๋ณธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์๋์ง ํ์คํ์ง ์์). ํค์๋(๋๋ ํค ๊ธฐํธ ?)์ ์ํด ํธ๋ฆฌ๊ฑฐ๋์ด์ผ ํฉ๋๋ค.
go func()
๊ฐ go(func())
์ด๋ฉด ์ด๋ค ๋๋์ด ๋ญ๋๊น ?
try
ํจ์ ๋์ bang(!)์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ ๊ธฐ๋ฅ ์ฒด์ธ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค:
func foo() {
f := os.Open!("")
defer f.Close()
// etc
}
func bar() {
count := mustErr!().Read!()
}
@sylr
go func() ๊ฐ go(func()) ๊ฐ ๋๋ค๋ฉด ์ด๋จ ๊ฒ ๊ฐ์ต๋๊น?
์, ๊ทธ๊ฒ์ ๊ฝค ๋ฐ์ ๋ค์ผ ๊ฒ์ ๋๋ค.
@sylr ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ์ด ์ค๋ ๋์ ๋ํ ๋์ฒด ์ ์์ ์์ฒญํ์ง ์์ต๋๋ค. ์ง์ค ์ ์ง์ ๋ํด์๋ ์ฐธ์กฐ ํ์ญ์์ค.
๊ทํ์ ์๊ฒฌ ์ ๊ดํ์ฌ : Go๋ ์ค์ฉ์ ์ธ ์ธ์ด์
๋๋ค. ์ฌ๊ธฐ์ ๋ด์ฅ๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ฉ์ ์ธ ์ ํ์
๋๋ค. ๋์์ธ ๋ฌธ์ ์์ ๊ธธ๊ฒ ์ค๋ช
ํ ๋๋ก ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. try
๋ $#$2 append
#$์ ๊ฐ์ด Go์ ์ฃผ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ๋ค๋ฅธ Go ๋ฉ์ปค๋์ฆ์ผ๋ก ๊ตฌํํ ์ ์๋ go
์ ๋์กฐ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ํจํด์ ๋ํ ๋จ์ํ ๊ตฌ๋ฌธ ์คํ์
๋๋ค. , copy
๋ฑ. ๋ด์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์ ํ์
๋๋ค.
(ํ์ง๋ง ๋ด๊ฐ ์ ์ ๋งํ๋ฏ์ด _that_์ด try
๊ฐ ํ์ฉ๋๋ ๊ฒ์ ๋ง๋ ์ ์ผํ ๊ฒ์ด๋ผ๋ฉด, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํค์๋๋ก ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.)
๋๋ ๋ด ์์ ์ ์ฝ๋ ์กฐ๊ฐ๊ณผ try
๋ก ์ด๋ป๊ฒ ๋ณด์ผ์ง ๊ณฐ๊ณฐ์ด ์๊ฐํ๊ณ ์์์ต๋๋ค.
slurp, err := ioutil.ReadFile(path)
if err != nil {
return err
}
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)
๋ ์ ์์ต๋๋ค:
return ioutil.WriteFile(path, append(copyrightText, try(ioutil.ReadFile(path))...), 0666)
์ด๊ฒ์ด ๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฝ๋๋ฅผ ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋จ์ง ๊ทธ๊ฒ์ ์ต์ํด์ง๋ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค.
@gbbr ์ฌ๊ธฐ์์ ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
slurp := try(ioutil.ReadFile(path))
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)
์ฌ์ ํ ๋ง์ ์์ฉ๊ตฌ๋ฅผ ์ ์ฝํ๋ฉด์๋ ํจ์ฌ ๋ ๋ช
ํํด์ง๋๋ค. ์ด๊ฒ์ try
๊ณ ์ ์ ๊ฒ์ด ์๋๋๋ค. ๋ชจ๋ ๊ฒ์ ํ๋์ ํํ์ผ๋ก ์์ถํ ์ ์๋ค๊ณ ํด์ ๋ฐ๋์ ๊ทธ๋์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
@griesemer ์ด ์์ ๋ ์๋ํ๋ _is_ ๊ณ ์ ํ ๊ฒ์ผ๋ก, ์ค๋ ์คํจํ ์ ์๋ ์ฝ๋๋ฅผ ์ค์ฒฉํ ์ ์์ต๋๋ค. ์ ์ด ํ๋ฆ์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. https://github.com/golang/go/issues/32825#issuecomment -507099786 / https://github.com/golang/go/issues/32825#issuecomment -507136111์์ ์ ๋ฆฌํ ๋ด์ฉ์ ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๋ต๋ณ https://github.com/golang/go/issues/32825#issuecomment -507358397. ๋์ค์ ๋์ผํ ๋ฌธ์ ๊ฐ https://github.com/golang/go/issues/32825#issuecomment -508813236 ๋ฐ https://github.com/golang/go/issues/32825#issuecomment -508937177์์ ๋ค์ ๋ ผ์๋์์ต๋๋ค. ๋ด๊ฐ ์ง์ ํ๋ ๊ฒ :
try์ ๋ํ ์ ์ค์ฌ ๋ ผ๊ฑฐ๋ฅผ ์ฝ์ด์ฃผ์ ์ ๊ธฐ์ฉ๋๋ค. ๊ตฌํ์ด ์ถฉ๋ถํ ์ ํ์ ์ด์ง ์์ต๋๋ค. ๊ตฌํ์ด ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋ชจ๋ ์ ์ ์ฌ์ฉ ์์ ์ผ์นํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
__๋๋_ ์ ์์์๋ ๊ตฌํ๊ณผ ์ผ์นํ๋ ์์ ๊ฐ ํฌํจ๋์ด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ๊ณ ๋ คํ๋ ๋ชจ๋ ์ฌ๋๋ค์ด Go ์ฝ๋์ ํ์ฐ์ ์ผ๋ก ๋ํ๋ ํญ๋ชฉ์ ๋ ธ์ถ๋ ์ ์์ต๋๋ค. ๋ชจ๋ ์ธ์ด/ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์ด์์ ์ผ๋ก ์์ฑ๋์ง ์์ ์ํํธ์จ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ง๋ฉดํ ์ ์๋ ๋ชจ๋ ์ฝ๋ ์ผ์ด์ค์ ํจ๊ป. ์ฌ๋ฌ ์ค์ฒฉ ์์ค์์ ์คํ ์ถ์ ์ด ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๊ฐ์ ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค. ์ค๋ฅ ์์น๋ฅผ ์ฝ๊ฒ ์ธ์ํ ์ ์์ต๋๊น? ๋ฉ์๋ ๊ฐ, ์ต๋ช ํจ์ ๋ฆฌํฐ๋ด์ ์ด๋ป์ต๋๊น? fn()์ ๋ํ ํธ์ถ์ด ํฌํจ๋ ์ค์ด ์คํจํ๋ฉด ์๋์์ ์์ฑํ๋ ์คํ ์ถ์ ์ ํ์ ๋ฌด์์ ๋๊น?
fn := func(n int) (int, error) { ... } return try(func() (int, error) { mu.Lock() defer mu.Unlock() return try(try(fn(111111)) + try(fn(101010)) + try(func() (int, error) { // yea... })(2)) }(try(fn(1)))
๋๋ ํฉ๋ฆฌ์ ์ธ ์ฝ๋๊ฐ ๋ง์ด ์์ฑ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์๊ณ ์์ง๋ง, ์ด์ ์ฐ๋ฆฌ๋ ์ด์ ์ ์กด์ฌํ์ง ์์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋ฐ๋ก ๋ช ํํ ์ ์ด ํ๋ฆ ์์ด ์ ์ฌ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋์ ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ์์ ๊ทธ๊ฒ์ ํ์ฉํ๋ ์ด์ ๋ฅผ ์ ๋นํํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ด๋ฐ ์ข ๋ฅ์ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ด๊ฐ ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝํ์ ํตํด ๋๊ตฐ๊ฐ๊ฐ ํ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๋ฐฐ์ ์ต๋๋ค. ๋๊ตฐ๊ฐ๋ ์ข ์ข ๋์๊ฒ ์ ๋ณด๊ฐ ์์ต๋๋ค.
Go๋ ์ฐ๋ฆฌ๊ฐ ๋์ผํ ํ๋ฒํ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋๋ก ์ ํํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ๋ด๊ฐ ์๋ก ์๊ฐ์ ๋ญ๋นํ ์ ์๋ ์ต์ํ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋์ ์ธ ํํ ์์ด ๊ทธ๊ฒ์ ์๊ณ ์ถ์ง ์์ต๋๋ค. ๋๋ "try๊ฐ ํจ์๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์"๊ฐ ์๋์ ์ธ ์ด์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์๋ ค์ฃผ์ค ์ ์๋์?
์์ ์คํจ ์์น๋ฅผ ๋ณด์ฌ์ฃผ๋ ์คํ ์ถ์ ์ ๊ฐ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ ๋๋ค. ์๋ง๋ ํด๋น ๊ธฐ๋ฅ์ ํธ์ถํ๋ ํ๋๊ฐ ์๋ ๋ณตํฉ ๋ฆฌํฐ๋ด์ ๋ฏน์ค์ ์ถ๊ฐํ ์ ์์๊น์? ์ค๋๋ ์คํ ์ถ์ ์ด ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ์ ๋ํด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์ฒญํ๋ ๊ฒ์ ๋๋ค. Go๋ ์คํ ์ ๋ณด์์ ์ฝ๊ฒ ์ํํ ์ ์๋ ์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๊ณ 16์ง์ ํจ์ ํญ๋ชฉ ์ฃผ์๋ง ์ ๊ณตํฉ๋๋ค. ์ํคํ ์ฒ ์ ๋ฐ์ ๊ฑธ์น ์คํ ์ถ์ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฌํญ์ด ์ด์ ๋ํด ๊ฑฑ์ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ฅผ ๊ณ ๋ คํด๋ณด์ธ์.
package main
import "fmt"
func dopanic(b bool) int { if b { panic("panic") }; return 1 }
type bar struct { a, b, d int; b *bar }
func main() {
fmt.Println(&bar{
a: 1,
c: 1,
d: 1,
b: &bar{
a: 1,
c: 1,
d: dopanic(true) + dopanic(false),
},
})
}
์ฒซ ๋ฒ์งธ ํ๋ ์ด๊ทธ๋ผ์ด๋๋ ์ผ์ชฝ ๋ํ๋์์ ์คํจํ๊ณ ๋ ๋ฒ์งธ ํ๋ ์ด๊ทธ๋ผ์ด๋๋ ์ค๋ฅธ์ชฝ์์ ์คํจํ์ง๋ง ๋ ๋ค ๋์ผํ ์คํ ์ถ์ ์ ์ธ์ํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ชฉํ์ธ์.
https://play.golang.org/p/SYS1r4hBS7O
https://play.golang.org/p/YMKkflcQuav
panic: panic
goroutine 1 [running]:
main.dopanic(...)
/tmp/sandbox709874298/prog.go:7
main.main()
/tmp/sandbox709874298/prog.go:27 +0x40
๋ ๋ฒ์งธ ๊ฒ์ +0x41 ๋๋ 0x40 ์ดํ์ ์คํ์ ์ด ๋ ๊ฒ์ผ๋ก ์์ํ๋๋ฐ, ์ด๋ ํจ๋ ๋ด์์ ์คํจํ ์ค์ ํธ์ถ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ 16์ง์ ์คํ์ ์ ์ป์๋๋ผ๋ ์ถ๊ฐ ๋๋ฒ๊น ์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ค๋๋ ์ด๊ฒ์ ์ฌ๋๋ค์ด ๊ฑฐ์ ์ง๋ฉดํ์ง ์๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค. ์ค์ฒฉ ๊ฐ๋ฅํ ๋ฒ์ ์ try๋ฅผ ์ถ์ํ๋ฉด ์ ์์์๋ try() + try() strconv๊ฐ ํฌํจ๋์ด ์์ด ์ด๋ฌํ ๋ฐฉ์์ผ๋ก try๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ ํ์ฉ ๊ฐ๋ฅํจ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ค์ด ๋ฉ๋๋ค.
1) ์์ ์ ๋ณด๋ฅผ ๊ฐ์ํ ๋ ์คํ ์ถ์ ์ ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ๊ณํ์ ๋๊น(์๋ ๊ฒฝ์ฐ) ๋ด ์ฝ๋๊ฐ ์ด๋์์ ์คํจํ๋์ง ์ฌ์ ํ ์ ์ ์์ต๋๊น?
2) ์๋ ์ค์ฒฉ์ด ํ์ฉ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ํ์ฉ๋ฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ค์ฒฉ ์๋์ ์ด์ ์ ๋ฌด์์ด๋ฉฐ ๋จ์ฉ์ ์ด๋ป๊ฒ ๋ฐฉ์งํ ์ ์์ต๋๊น? ํ์ฌ ์ฐ๋ฆฌ๋ ์ต์์/๊ฐ์ฅ ์๊ฒฉํ ์ฌ์ฉ ์๋ง ์ป๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ์ฝ๋์ ๋ฏธ์น๋ ์ํฅ์ ๋ํด ๋ ๋ง์ ์ ๋ณด์ ์
๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ํ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์๊ฐํ๋ ์ค์ฒฉ๋ ์๋๋ฅผ ์ํํ๋๋ก tryhard๋ฅผ ์กฐ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ด๋ค ์ ํ์ vet
์ ํ์ด ๋ถ๊ณผ๋ ๊ฒ์ธ์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ ๊ณตํ ๊ฒ์
๋๋ค. ์ง๊ธ ์์์ฌ๊ฐ ๋ถํฉ๋ฆฌํ ์๋์ ๋ํ ๋ฐฉ์ด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ์ง๋ง ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์คํ๋ ๊น์?
3) ๊ตฌํ์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ฒฉ์ ์๋ํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ Go๊ฐ ์ถ์๋ ์ดํ ๊ฐ์ฅ ๋์ ๋๋ ์ธ์ด ๋ณํ์ ๋ํ ๋งค์ฐ ์ฝํ ์ฃผ์ฅ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๊น?
์ด ๋ณ๊ฒฝ์ ์ค์ฒฉ ์๋์ ๋ํด ๋ ๋ง์ ๊ณ ๋ ค๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ๋๋ง๋ค ์ด๋๊ฐ์์ ์๋ก์ด ๊ณ ํต์ ์ด ๋ํ๋ ๋๋ง๋ค ๋๋ ๊ทธ๊ฒ์ด ์ผ์์์ ๋ฐํ์ง ๋๊น์ง ๋ชจ๋ ์ ์ฌ์ ์ธ ๋ถ์ ์ ์ธ ์ ์ด ๋ํ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋งค์ฐ ๊ฑฑ์ ํฉ๋๋ค. ๋ํ ์ค์ฒฉ์ https://github.com/golang/go/issues/32825#issuecomment -506882164์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ค๋๋ ์๋ ๋ถ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ๋์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. "์์์ฌ" ์ด์ผ๊ธฐ๊ฐ ์ฌ๊ธฐ์ ์ ๊ณต๋ ์ ํดํ try() ์์ ์ ๋ํ ๋ฐฉ์ด๋ก ์ฌ์ฉ๋๊ฑฐ๋ ๊ตฌํ์์ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๋ฅผ ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ์ ํจ๊ป ํจ์ฌ ๋ ๊ตฌ์ฒด์ ์ธ ๊ณํ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์์ ์ธ ๋ชจ๋ฒ ์ฌ๋ก ์ด์ธ์ ์ฌ์ฉ์ ์ํด.
ํธ์ง: gophers์๊ฒ play.golang.org ์ํคํ ์ฒ์ ๋ํด ๋ฌผ์๊ณ ๋๊ตฐ๊ฐ NaCl์ ํตํด ์ปดํ์ผํ๋ค๊ณ ์ธ๊ธํ์ผ๋ฏ๋ก ์๋ง๋ ๊ทธ ๊ฒฐ๊ณผ/๋ฒ๊ทธ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ค๋ฅธ ์์น์์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ์ฉ๋ฒ์ด ์ ์ ์ ์ด๊ณ ๊นจ๋ํ ๋จ์ผ ๋ผ์ธ ์ฌ์ฉ์ ์ค์ฌ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ํ ์ค์ ์ฌ๋ฌ ๋ฐํ์ ๋์ ํจ์ผ๋ก์จ ๋ฐ์ํ ์ ์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ ํ ํ๊ตฌ๋์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋จ, ์ด '๋ง๋ฒ'์ ์ธ์ด์ ์ถ๊ฐํ์ง ๋ง์ธ์.
์ด๊ฒ๋ค์ ๋๋จธ์ง ์ธ์ด์ ๊ฐ์ ๋ชจ์๊ณผ ๋๋์ด ์๋๋๋ค.
๋๋ ์ด๋ฏธ ์ด์ ๊ฐ์ ์ฝ๋๊ฐ ์ด๋์์๋ ๋ํ๋๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
a, b := try( f() )
if a != 0 && b != "" {
...
}
...
๋์ ์
a,b,err := f()
if err != nil {
...
}
...
๋๋
a,b,_:= f()
call if err....
ํจํด์ ์ฒ์์๋ ์ฝ๊ฐ ๋ถ์์ฐ์ค๋ฌ์ ์ง๋ง ์ด์ ๋ ์ต์ํด์ก์ต๋๋ค.
์ผ๋จ ๋ฐ์ํ๋ฉด ์ด๋ค ์ข
๋ฅ์ ์ํ๋ฅผ ์ถ์ ํด์ผ ํ๋ ๋ํผ/ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ ๋์ ์ค๋ฅ๊ฐ ์คํ ํ๋ฆ์ ๋์ฐฉํ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํค๋ณด๋์ ์๋ช
์ ๊ตฌํ๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ๋ฌด์ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ์ธ์ ๊ฐ๋ ๋นํฉํ๊ฒ ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋๋ ์ฌ์ง์ด vbscript์์ ๋ด ์ต๊ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค.
on error resume next
a = f()
if er.number <> 0 then
...
end if
...
๋๋ ์ด ์ ์์ ์ข์ํ๋ค
๋ด๊ฐ ๊ฐ์ง ๋ชจ๋ ์ฐ๋ ค(์: ์ด์์ ์ผ๋ก๋ ๊ธฐ๋ณธ ์ ๊ณต์ด ์๋ ํค์๋์ฌ์ผ ํจ)๋ ์ฌ์ธต ๋ฌธ์์์ ํด๊ฒฐ๋ฉ๋๋ค.
100% ์๋ฒฝํ์ง๋ ์์ง๋ง a) ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ b) ๋ง์ ํ์ ํธํ์ฑ ๋ฐ ๊ธฐํ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ๋ฉด์ ํด๊ฒฐํ๊ธฐ์ ์ถฉ๋ถํ ์๋ฃจ์ ์ ๋๋ค.
๋ฌผ๋ก ์ฝ๊ฐ์ '๋ง๋ฒ'์ ์ํํ์ง๋ง defer
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ํค์๋ ๋ ๋ด์ฅ์ด๋ฉฐ ์ฌ๊ธฐ์์ ํค์๋๋ฅผ ํผํ๋ ์ ํ์ด ์๋ฏธ๊ฐ ์์ต๋๋ค.
try()
์ ์์ ๋ํ ๋ชจ๋ ์ค์ํ ํผ๋๋ฐฑ์ด ์ด๋ฏธ ํ๋ช
๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) try()๋ ์์ง ์ฝ๋ ๋ณต์ก์ฑ์ ์ํ์ผ๋ก ์ด๋ํฉ๋๋ค.
2) ์ค์ฒฉ๋ try() ํธ์ถ์ ์ผํญ ์ฐ์ฐ์ ๋งํผ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค.
3) ์๊ฐ์ ์ผ๋ก ๊ตฌ๋ณ๋์ง ์๋ ๋ณด์ด์ง ์๋ '๋ฆฌํด' ์ ์ด ํ๋ฆ ๋์
( return
ํค์๋๋ก ์์ํ๋ ๋ค์ฌ์ฐ๊ธฐ ๋ธ๋ก๊ณผ ๋น๊ต)
4) ์ค๋ฅ ๋ํ ๊ดํ์ ์
ํ์ํต๋๋ค(ํน์ ์์
๋์ ๊ธฐ๋ฅ ์ปจํ
์คํธ).
5) #golang ์ปค๋ฎค๋ํฐ ๋ฐ ์ฝ๋ ์คํ์ผ ๋ถํ (anti-gofmt)
6) ๊ฐ๋ฐ์๊ฐ try()๋ฅผ if-err-nil๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ์์ฃผ ๋ค์ ์์ฑํ๊ฒ ํฉ๋๋ค(tryhard ๋ ์ ๋ฆฌ ๋
ผ๋ฆฌ ์ถ๊ฐ/์ถ๊ฐ ๋ก๊ทธ/๋ ๋์ ์ค๋ฅ ์ปจํ
์คํธ)
@VojtechVitek ๋๋ ๋น์ ์ด ๋ง๋ ์์ ์ด ์ฃผ๊ด์ ์ด๋ฉฐ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ง์งํ๊ฒ ์ฌ์ฉํ๊ธฐ ์์ํ ํ์๋ง ํ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ง์ด ๋
ผ์๋์ง ์์ ํ ๊ฐ์ง ๊ธฐ์ ์ ์์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. defer
๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ ์ธ๋ผ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ๋ํ/์ฅ์์ defer
๋ฅผ ์ฌ์ฉํ๋ ํจํด์ defer
์์ฒด์ ๋จ์ํ ๋น์ฉ์ ๋์ด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ฆ, ์ค๋ฅ ๋ํ๊ณผ ํจ๊ป try
๋ฅผ ์ฑํํ๋ฉด err != nil
๊ฒ์ฌ ์งํ ๋ํ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ๋ ๊ฐ์ง ์ ์ฌ์ ์ธ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
defer
์ ๋ํ ๋ช ๊ฐ์ง ์ธ์์ ์ธ ํฅํ ์ฑ๋ฅ ๊ฐ์ ์ฌํญ์ด ์์ง๋ง ๋น์ฉ์ ์ฌ์ ํ โโ0์ด ์๋๋๋ค.
try
๋ ๋ง์ ์ ์ฌ๋ ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Go ํ์ด defer
๋ฅผ ํตํด ์ ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋์ ์คํจ ์ง์ ์์ ์ผ์ข
์ ๋ํ์ ์ํํ ์ ์๋๋ก ๋์์ธ์ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. .
์์์ฌ" ์ด์ผ๊ธฐ๋ ํจ์ฌ ๋ ๊ตฌ์ฒด์ ์ธ ๊ณํ์ด ํ์ํฉ๋๋ค
์์์ฌ ์ด์ผ๊ธฐ๋ ๋ํ์ ๋๋ค. ์๋ ค์ง ์ ํ์์๋ง ์๋ํ๋ฉฐ ์ฌ์ฉ์ ์ ์ ์ ํ์์๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์ด์ ๊ฐ์ ์ ์์ ๋ํ ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์๋ฏธ, ์ ์ถฉ์ ๋ฐ ์งํ ๋ฐฉ๋ฒ์ ๋ํด ์ปค๋ฎค๋ํฐ ์ ์ฒด์ ํ ๋ก ์ ํ๊ณ , ๊ทธ ํ ๋ก ์ ์ฌ์ฉํ์ฌ ์์ผ๋ก์ ๊ธธ์ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ ๋๋ค.
์๋์ ์ธ ์ปค๋ฎค๋ํฐ ๋ฐ์๊ณผ ์ฌ๊ธฐ์์์ ๊ด๋ฒ์ํ ํ ๋ก ์ ๋ฐํ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ด ์ ์์ด ์์ ๋ณด๋ค ๋นจ๋ฆฌ ๊ฑฐ์ ๋ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค.
๊ธฐ์ ํผ๋๋ฐฑ๊ณผ ๊ด๋ จํ์ฌ ์ด ํ ๋ก ์์๋ ์ฐ๋ฆฌ๊ฐ ๋์น ๋ช ๊ฐ์ง ์ค์ํ ๊ณ ๋ ค ์ฌํญ, ํนํ ๋๋ฒ๊น ์ธ์ ์ถ๊ฐ ๋ฐ ์ฝ๋ ์ ์ฉ ๋ฒ์ ๋ถ์์ ๋ํ ์๋ฏธ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค.
๋ ์ค์ํ ๊ฒ์, ์ฐ๋ฆฌ๋ ์ด ์ ์์ด ๊ฐ์น ์๋ ๋ฌธ์ ๋ฅผ ๊ฒจ๋ฅํ ๊ฒ์ด ์๋๋ผ๊ณ ์ฃผ์ฅํ๋ ๋ง์ ์ฌ๋๋ค์ ๋ถ๋ช ํ ๋ค์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ Go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋ฒฝํ์ง ์๊ณ ์๋ฏธ ์๊ฒ ๊ฐ์ ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ปค๋ฎค๋ํฐ๋ก์ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํน์ ์ธก๋ฉด์ ๋ํด ๋ ๋ง์ด ์ด์ผ๊ธฐํด์ผ ํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํฉ๋๋ค.
ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํด ๋
ผ์ํ๋ ๋งํผ ์ง๋ 8์ " Go 2 ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ์ "์์ ๋ฌธ์ ์ ๋ํ ๋น์ ์ ์ ์ํ๋ ค๊ณ ํ์ง๋ง ๋์ด์ผ๋ณด๋ฉด ๊ทธ ๋ถ๋ถ์ ๋ํด ์ถฉ๋ถํ ๊ด์ฌ์ ๊ธฐ์ธ์ด์ง ์์๊ณ ์ถฉ๋ถํ ์ฅ๋ คํ์ง ์์์ต๋๋ค. ํน์ ๋ฌธ์ ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์ ์ธ์ง์ ๋ํ ํ ๋ก . try
์ ์์ ๊ฑฐ๊ธฐ์ ์ค๋ช
๋ ๋ฌธ์ ์ ๋ํ ํ๋ฅญํ ํด๊ฒฐ์ฑ
์ผ ์ ์์ง๋ง ๋ง์ ์ฌ๋๋ค์๊ฒ ๋จ์ํ ํด๊ฒฐํ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์์ผ๋ก ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ด๊ธฐ ๋ฌธ์ ์ง์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํ ๊ด๋ฒ์ํ ๋์๊ฐ ์๋์ง ํ์ธํ๋ ์์
์ ๋ ์ ์ํํด์ผ ํฉ๋๋ค.
(๊ฐ์ ๋ ์ ๋ค๋ฆญ ๋์์ธ ๋๋ํํธ๋ฅผ ๊ณต๊ฐํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ์ค๋ช ์ ์์ ํ ์ ์คํ ์ด์งํ์ ์๋ ์์ต๋๋ค.)
Go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ ํด์ผ ํ ์ฌํญ์ ๋ํ ๊ด๋ฒ์ํ ์ฃผ์ ์์ Go์ ์ค๋ฅ ์ฒ๋ฆฌ ์ธก๋ฉด์ด ๊ทํ์ ์ฝ๋๋ฒ ์ด์ค ๋ฐ ์์ ํ๊ฒฝ์์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๊ณ ์ข์ ์๋ฃจ์ ์ด ์ผ๋ง๋ ํฐ ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ๋ณด๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ์์ ์ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ Go2ErrorHandlingFeedback ํ์ด์ง ์ ๋งํฌ๋ฅผ ๊ฒ์ํ์ญ์์ค.
์ฌ๊ธฐ์ ๋ค๋ฅธ ๊ณณ์์ ์ด ํ ๋ก ์ ์ฐธ์ฌํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Russ Cox๊ฐ ์ด์ ์ ์ง์ ํ๋ฏ์ด ์ด์ ๊ฐ์ ์ปค๋ฎค๋ํฐ ์ ์ฒด ํ ๋ก ์ ์ต๊ณ ์ ์คํ ์์ค ์ ๋๋ค. ์ด ํน์ ์ ์์ ๊ฒํ ํ๊ณ ๋ ์ผ๋ฐ์ ์ผ๋ก Go์์ ์ค๋ฅ ์ฒ๋ฆฌ ์ํ๋ฅผ ๊ฐ์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ ผ์ํ๋ ๋ฐ ๋์์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ ์ ๊ฒํ ์์ํ์ ๋ก๋ฒํธ ๊ทธ๋ฆฌ์ฆ๋จธ(Robert Griesemer).
์๋ ์ ์์ ๋ค์ด๊ฐ ์์ ์ ๋ํด Go Team์๊ฒ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ๋์์ ์ ์ํ ๋ ผํ์์๊ฒ ๊ฐ์ฌํฉ๋๋ค. ๋๋๋ก ์ด๋ฌํ ๊ฒ๋ค์ ์ค์ค๋ก ๋ชฉ์จ์ ์์๊ฐ๋๋ค. ๊ฒฝ์ฒญํด์ฃผ์๊ณ ์ ์ ํ๊ฒ ๋์ํด์ฃผ์ Go Team์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ผ!
์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
Go์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๋ฌธ์ ๋ฐ ๋ถ์ ์ ์ธ ๊ฒฝํ์ ๋ชฉ๋ก์ ๋ํ ํธ์ถ์
๋๋ค. ํ์ง๋ง,
๋์ ํ์ ํ๋ก๋์
ํ๊ฒฝ์์ xerrors.As, xerrors.Is ๋ฐ xerrors.Errorf์ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค. ์ด๋ฌํ ์๋ก์ด ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ํ ์์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋๋ผ์ด ๋ฐฉ์์ผ๋ก ์์ ํ ๋ณ๊ฒฝํฉ๋๋ค. ํ์ฌ๋ก์๋ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ ์๊ตฌ ์ฌํญ์ด ๋ฐ์ํ์ง ์์์ต๋๋ค.
@griesemer ๋น์ ์ ์ธ๋ด์ ๋ ธ๋ ฅ์ ๋ํด (๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋น์ ๊ณผ ํจ๊ป ์ผํ ๋ง์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ) ๊ฐ์ฌํ๋ค๋ ๋ง์ ์ ํ๊ณ ์ถ์์ต๋๋ค.
์ข์!
@griesemer ๋ชจ๋ ํผ๋๋ฐฑ์ ๋์์์ด ๊ฒฝ์ฒญํ๊ณ ์ฐ๋ฆฌ์ ๋ค์ํ ์๊ฒฌ์ ์ฐธ์์ฃผ์ Go ํ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ง๊ธ์ด ์ด ์ค๋ ๋๋ฅผ ์ข ๋ฃํ๊ณ ๋ฏธ๋์ ์ผ๋ค๋ก ๋์ด๊ฐ๊ธฐ์ ์ข์ ์๊ฐ์ด ์๋๊น์?
@griesemer @rsc ๋ฐ @all , ๋ฉ์ง๋ค์. ๋ชจ๋ ๊ฐ์ฌํฉ๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ ํ๋ฅญํ ํ ๋ก /์๋ณ/๋ช ๋ฃํ์ ๋๋ค. go์ '์ค๋ฅ' ๋ฌธ์ ์ ๊ฐ์ ์ผ๋ถ ๋ถ๋ถ์ ๊ฐ์ ์ ๋จผ์ ํต์ฌ ๋ฌธ์ ๋ฅผ ์๋ณ/๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ๋ ์ด๋ฆฐ ํ ๋ก (์ ์ ๋ฐ ์๊ฒฌ์์ ...)์ด ํ์ํฉ๋๋ค.
ps. ํ์ฌ๋ก์๋ x/xerrors๊ฐ ์ข์ต๋๋ค.
(์ด ์ค๋ ๋๋ ์ ๊ทธ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค...)
์ด์ ์ฐธ์ฌํด ์ฃผ์ ํ๊ณผ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๋ง์ ์ฌ๋๋ค์ด Go์ ๊ด์ฌ์ ๊ฐ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
์ปค๋ฎค๋ํฐ๊ฐ ์ฒ์์ ์๋ ์ ์์ ๋ค์ด๊ฐ ๋ ธ๋ ฅ๊ณผ ๊ธฐ์ ์ ๋จผ์ ๋ณด๊ณ ์ด ๊ฒฐ์ ์ ๋๋ฌํ๋ ๋ฐ ๋์์ด ๋ ์ฐธ์ฌ ์ ์ ์ ๋ณด์์ผ๋ฉด ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ ์งํ ์ ์๋ค๋ฉด, ํนํ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ธ์ ์ ์ธ ํ๋๋ฅผ ์ ์งํ ์ ์๋ค๋ฉด ๋ฐ๋์ ๋ฏธ๋๋ ๋งค์ฐ ๋ฐ์ต๋๋ค.
func M() (๋ฐ์ดํฐ, ์ค๋ฅ){
a, err1 := A()
b, err2 := B()
๋ฐํ b, nil
} => (err1 != nil์ธ ๊ฒฝ์ฐ){ return a, err1}.
(err2 != nil์ธ ๊ฒฝ์ฐ){ b๋ฅผ ๋ฐํ, err2}
์ข์์... ์ด ์ ์์ด ๋ง์์ ๋ค์์ง๋ง ์ปค๋ฎค๋ํฐ์ Go ํ์ด ๋ฐ์ํ๊ณ ๊ฑด์ค์ ์ธ ํ ๋ก ์ ์ฐธ์ฌํ๋ ๋ฐฉ์์ด ๋ง์์ ๋ค์์ต๋๋ค. ๋๋ก๋ ๋ค์ ๊ฑฐ์น ์์ง๋ง.
์ด ๊ฒฐ๊ณผ์ ๊ด๋ จํ์ฌ 2๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
1/ "์ค๋ฅ ์ฒ๋ฆฌ"๋ ์ฌ์ ํ ์ฐ๊ตฌ ์์ญ์
๋๊น?
2/ ๊ฐ์ ์ฐ๊ธฐ์ ์ฐ์ ์์๊ฐ ๋ค์ ์ง์ ๋ฉ๋๊น?
์ด๊ฒ์ Go ์ปค๋ฎค๋ํฐ๊ฐ ๋ ผ์์ ์ฌ์ง๊ฐ ์๋ ์ธ์ด ๋ณ๊ฒฝ ์ ์์ ๋ฃ๊ณ ํ ๋ก ํ ์ ์์์ ๋ค์ ํ ๋ฒ ์ฆ๋ช ํฉ๋๋ค. ์ธ์ด๋ก ๋ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ ์ฌํญ์ ๋๋ค. ์ด ์ ์์ ๋ํ ๋ ธ๊ณ ์ ๋ฌธ๋ช ํ๋ ํ ๋ก ์ ๋ํด Go ํ๊ณผ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํ๋ฅญํ!
๊ต์ฅํ๋ค, ๊ฝค ๋์์ด ๋๋ค
์ด์ฉ๋ฉด ๋ด๊ฐ ๋ฐ๋์ ๋๋ฌด ์ง์ฐฉํ์ ์๋ ์์ง๋ง ์ฌ๊ธฐ์์ ์์ ์ด ๋ค์๊ณผ ๊ฐ์ด ํ์๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Russ๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํฉ๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ๋จ์ํ
๋จธ๋ฆฌ ์๋ ๋ญ, ๊ทธ๊ฒ์ ์๊ฐํ๊ณ ์์ด์ผ ํ ํ์
๋๋ค.
์์ ์ ์ด์ต์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
Go ํ์ด ์ ๊ณตํ๋ ์กฐ์ ๋๋ถ์ ์ฐ๋ฆฌ๋
์ฐ๋ฆฌ๊ฐ ํจ๊ป ์ด ์ ์๋ ๊ฒฐ๋ก ์ ๋๋ฌํ ๊ฒ์ ๋ชจ๋ ์๋์ค๋ฝ๊ฒ ์๊ฐํฉ๋๋ค.
์กฐ๊ฑด์ด ๋ ๋ฌด๋ฅด์ต์ผ๋ฉด ์์ฌํ ์ฌ์ง ์์ด ๋ค์ ๋ฐฉ๋ฌธํ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์์ ๋๋ผ๋ ๊ณ ํต์ด ๋ฏธ๋์ ์ฐ๋ฆฌ์๊ฒ ์ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
(๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌํ์ง ์์๊น์?).
๋ฃจ์์ค.
๋๋ ๊ทธ ๊ฒฐ์ ์ ๋์ํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ฐ๋ ํ์ด ์ทจํ ์ ๊ทผ ๋ฐฉ์์ ์ ๋์ ์ผ๋ก ์ง์งํฉ๋๋ค. ์ปค๋ฎค๋ํฐ ์ ์ฒด์์ ํ ๋ก ํ๊ณ ๊ฐ๋ฐ์์ ํผ๋๋ฐฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์คํ ์์ค์ ์๋ฏธ์ ๋๋ค.
์ต์ ํ ์ฐ๊ธฐ๋ ๋์ฌ์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ค๋ฅ์ xerrors๋ฅผ ํจ๊ป ์ฃผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ข์ํ๋๋ฐ ์ง๊ธ ๋น์ฅ์ ๋น์ฉ์ด ๋๋ฌด ๋ง์ด ๋ญ๋๋ค.
@pierrec ์ค๋ฅ ์ฒ๋ฆฌ์ ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉํ ์ง ๋ ๋ช ํํ๊ฒ ์ดํดํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ฅ ๊ฐ ๋ณ๊ฒฝ ์ค ์ผ๋ถ๋ ํฅํ 1.13 ๋ฆด๋ฆฌ์ค(https://tip.golang.org/doc/go1.13#errors)์ ํฌํจ๋ ์์ ์ด๋ฉฐ ์ด์ ๋ํ ๊ฒฝํ์ ์ป์ ๊ฒ์ ๋๋ค. ์ด ํ ๋ก ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ ๋ง์ ๊ตฌ๋ฌธ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์ ๋ณด์๊ณ ์ฌ๋๋ค์ด ํนํ ์ ์ฉํด ๋ณด์ด๋ ๊ฒ์ ํฌํํ๊ณ ์๊ฒฌ์ ๋งํ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๋ ์ผ๋ฐ์ ์ผ๋ก @griesemer ๊ฐ ๋งํ๋ฏ์ด ๊ฒฝํ ๋ณด๊ณ ์๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ด ์ธ์ด๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ ์ด๋ ์ ๋ ๋ฌธ์ ๊ฐ ์๋์ง ๋ ์ ์ดํดํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ ๋๋ค.
https://golang.org/cl/183677 ์์ defer
์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ์์
์ด ํ๋ฐํ ์งํ ์ค์ด๋ฉฐ ์ฃผ์ ์ฅ์ ๋ฌผ์ด ๋ฐ์ํ์ง ์๋ ํ 1.14 ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@griesemer @ianlancetaylor @rsc ์ฌ๊ธฐ์ ์ ๊ธฐ๋ ๋ฌธ์ ์ ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ํด๊ฒฐํ๋ ๋ค๋ฅธ ์ ์์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ๊ณ์ ํด๊ฒฐํ ๊ณํ์ ๋๊น?
๋ฐ๋ผ์ ํํฐ์ ๋ฆ์์ง๋ง ์ด๊ฒ์ ์ด๋ฏธ ๊ฑฐ๋ถ๋์์ง๋ง ์ฃผ์ ์ ๋ํ ํฅํ ํ ๋ก ์ ์ํด ์ผํญ๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ถ ๋ฐํ ๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น? (๋๋ ์ฃผ์ ๋ฅผ ์ค์บํ๊ฑฐ๋ Russ Cox๊ฐ Twitter์ ๊ฒ์ํ ๋ด์ฉ์ ์ดํด๋ณด์์ ๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค.) ์:
f, err := Foo()
return err != nil ? nil, err
err์ด nil์ด ์๋๋ฉด nil, err
๋ฅผ ๋ฐํํ๊ณ err์ด nil์ด๋ฉด ์คํ์ ๊ณ์ํฉ๋๋ค. ์ง์ ์์์
return <boolean expression> ? <return values>
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์์ ์คํ์ด ๋ ๊ฒ์ ๋๋ค.
if <boolean expression> {
return <return values>
}
์ฃผ์ ์ด์ ์ ์ด๊ฒ์ด check
ํค์๋ ๋๋ try
return err != nil || f == nil ? nil, fmt.Errorf("failed to get Foo")
ํจ์๋ณด๋ค ๋ ์ ์ฐํ๋ค๋ ๊ฒ์
๋๋ค. ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒ(์: return err != nil && err != io.EOF ? nil, err
) ๋ฑ์ด์ง๋ง ์ฝ์ ๋ ์ดํดํ๊ธฐ์๋ ์ฌ์ ํ ์๋นํ ์ง๊ด์ ์
๋๋ค(ํนํ ๋ค๋ฅธ ์ธ์ด๋ก ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฝ๋ ๋ฐ ์ต์ํ ๊ฒฝ์ฐ).
๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ผ๋ถ ์ง์ฐ ๋ฌธ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ฐ์ํ์ง ์๊ณ _์ฌ์ ํ ํธ์ถ ์์น_์์ ๋ฐ์ํ๋๋ก ํฉ๋๋ค. ๋ด๊ฐ ์๋ ์ ์์ ๋ํด ๊ฐ์ง๊ณ ์์๋ ๊ฐ์ฅ ํฐ ๋ถ๋ง ์ค ํ๋๋ ์ด๋ค ๋ฉด์์ ์ค๋ฅ์ ์ค์ _์ฒ๋ฆฌ_๋ฅผ ์์์ ํ๋ก์ธ์ค๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ๊ฐ 0์ด ์๋ ๋ ์๋์ผ๋ก ๋ฐ์ํฉ๋๋ค. ํจ์ ํธ์ถ์ด nil์ด ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ๋ฐํ๋ฉ๋๋ค. ์์ธ์ ๊ฐ์ ์์คํ ๋์ ๋ช ์์ ์ค๋ฅ ๋ฐํ์ ์ฌ์ฉํ๋ Go์ ์ ์ฒด _point_๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ก ์ ์ผ๋ก ๋ ๋์ ์ง์ ์์ ์ฒ๋ฆฌ๋๋๋ก ์คํ์ ์ ํํ๋ ๊ฒ๋ณด๋ค ๋ช ์์ ์ด๊ณ ์๋์ ์ผ๋ก ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ์ฒ๋ฆฌํ๋๋ก ๊ถ์ฅํ๋ ๊ฒ์ ๋๋ค. ์๋ก. ์กฐ๊ฑด๋ถ๋ผ๋ฉด ์ต์ํ ๋ช ์์ ์ธ return ๋ฌธ์ ์งํ ์ํฉ์ ๋ช ํํ๊ฒ ์ค๋ช ํฉ๋๋ค.
@ngrilly @griesemer ๊ฐ ๋งํ๋ฏ์ด Go ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ธก๋ฉด์ ๋ ์ ์ดํดํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋งํด์, ์ฝ๊ฐ์ ์ฅํฉํจ์ ์ ๊ฑฐํ๋ ์ ์์ ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฒฐ๊ตญ, ์ธ์ด๋ ์ค๋๋ ์ถฉ๋ถํ ์ ์๋ํฉ๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ์๋ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค. ๋ณ๊ฒฝํ๋ ค๋ฉด ์๋นํ ์ด์ ์ด ํ์ํฉ๋๋ค. ๋๋ ์ด ์ ์์ด ์ฅํฉํจ์ ์ค์ด๋ ๋ฐ ์๋นํ ์ด์ ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋ถ๊ณผ๋ ์ถ๊ฐ ๋น์ฉ์ด ๋๋ฌด ๋๋ค๊ณ ๋๋ผ๋ Go ํ๋ก๊ทธ๋๋จธ์ ์๋นํ ๋ถ๋ถ์ด ๋ถ๋ช ํ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค๊ฐ ์ง์ ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ ๋ฌธ์ ๊ฐ ํด๊ฒฐํ ๊ฐ์น๊ฐ ์๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค.
@kaedys ์ด ํ์์ ์ด๊ณ ๋งค์ฐ ์ฅํฉํ ๋ฌธ์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ํน์ ๋์ฒด ๊ตฌ๋ฌธ์ ๋ ผ์ํ๊ธฐ์ ์ ํฉํ ์ฅ์๊ฐ ์๋๋๋ค.
@ianlancetaylor
๋๋ ์ด ์ ์์ด ์ฅํฉํจ์ ์ค์ด๋ ๋ฐ ์๋นํ ์ด์ ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋ถ๊ณผ๋ ์ถ๊ฐ ๋น์ฉ์ด ๋๋ฌด ๋๋ค๊ณ ๋๋ผ๋ Go ํ๋ก๊ทธ๋๋จธ์ ์๋นํ ๋ถ๋ถ์ด ๋ถ๋ช ํ ์์ต๋๋ค.
์๊ธฐ ์ ํ ํธํฅ์ด ์๋ ๊ฒ ๊ฐ์์. Go๋ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ๋ค๋ฆญ์ด ์๋ ๊ฒ์ผ๋ก ์ ๋ช ํฉ๋๋ค. ์ด๊ฒ์ ์์ฐ์ค๋ฝ๊ฒ ์ด ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ ๋๋ค. ๊ทธ ๋์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ํ์ฌ ์ธ์ด(Java, C++, C#, Python, Ruby ๋ฑ)๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ๋ ํ๋์ ์ธ ์ธ์ด(Rust, TypeScript, Kotlin, Swift, Elixir ๋ฑ)๋ก ์ ํํฉ๋๋ค. . ๋๋ถ๋ถ ์ด๋ฐ ์ด์ ๋ก Go๋ฅผ ํผํ๋ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ์๊ณ ์์ต๋๋ค.
๋ํ ํ์ฆ ํธํฅ์ด ์์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Gophers๋ ์ฌ๋๋ค์ด Go๋ฅผ ๋นํํ ๋ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ถ์กฑ์ ๋ฐฉ์ดํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค. ์ด๊ฒ์ try์ ๊ฐ์ ์ ์์ ๊ฐ๊ด์ ์ผ๋ก ํ๊ฐํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
Steve Klabnik์ ๋ฉฐ์น ์ ์ Reddit์ ํฅ๋ฏธ๋ก์ด ๋
ผํ์ ๊ฒ์ํ์ต๋๋ค . ๊ทธ๋ Rust์ ?
๋ฅผ ๋์
ํ๋ ๊ฒ์ ๋ฐ๋ํ์ต๋๋ค. ์๋ํ๋ฉด "๊ฐ์ ๊ฒ์ ์์ฑํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ"์ด๊ณ "๋๋ฌด ์๋ฌต์ "์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ๋ช ์ค ์ด์์ ์ฝ๋๋ฅผ ์์ฑํ ํ ?
๋ ๊ทธ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ธฐ๋ฅ ์ค ํ๋์
๋๋ค.
@ngrilly ๋ ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ด๋ฌํ ํธ๊ฒฌ์ ํผํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๋งค์ฐ ๋์์ด ๋๋ ๊ฒ์ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ๋ก ์ธํด ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด Go๋ฅผ ํผํ๋์ง ๋ ๋ช ํํ๊ฒ ์ดํดํ๋ ๊ฒ์ ๋๋ค. ์ซ์๊ฐ 0์ด ์๋ ๊ฒ์ ํ์คํ์ง๋ง ์ธก์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ฆ, try
๊ฐ ๋ณด๊ธฐ ์ด๋ ค์ด ์ ์ด ํ๋ฆ์ ์๋ก์ด ๋ณ๊ฒฝ์ ๋์
ํ์ผ๋ฉฐ try
๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋๊ธฐ ์ํ ๊ฒ์ด์ง๋ง ์ค๋ฅ ์ฃผ์ ์ฒ๋ฆฌ์๋ ๋์์ด ๋์ง ์์ ๊ฒ๋ ์ฌ์ค์
๋๋ค. .
Steve Klabnik์ ์ธ์ฉ๋ฌธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๊ทธ ๊ฐ์ ์ ๊ฐ์ฌํ๊ณ ๋์ํ์ง๋ง, ์ธ์ด๋ก์ Rust๊ฐ Go๋ณด๋ค ๊ตฌ๋ฌธ์ ์ธ๋ถ ์ฌํญ์ ๋ ๊ธฐ๊บผ์ด ์์กดํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ์ ์ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ด ์ ์์ ์ง์ง์๋ก์ ๋ฐ๋ํ์ด ์ํฉ์์ ์ณ์ ์ผ์ ํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ง๊ธ์ ์ฒ ํ๋ ๊ฒ์ ๋น์ฐํ ์ค๋งํฉ๋๋ค.
์ด์ ๋งค์ฐ ๋ช ํํด ๋ณด์ด๋ ํ ๊ฐ์ง๋ ๋๋ถ๋ถ์ Go ์ฌ์ฉ์๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ ๋ฌธ์ ๋ก ๊ฐ์ฃผํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ทธ๊ฒ์ด ์ ์ฌ์ ์ธ ์ ๊ท ์ฌ์ฉ์๋ฅผ ์ฐ๊ธฐํ๋๋ผ๋ ๋๋จธ์ง ์ฐ๋ฆฌ๋ ์ด์๊ฐ์ผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. .
๋๋ ๋ด๊ฐ ์ฝ์ ๋์ ์ ์์ ์๋ฅผ ์ธ์ง ๋ชปํ๊ณ ์ผ๋ถ๋ ๊ฝค ์ข์์ง try
๊ฐ ๋จผ์ง๋ฅผ ๋ฌผ๋ฉด ์ฑํํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ ์ ์์ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ค๋ ์ ์์ด ๋์ฌ ๊ฐ๋ฅ์ฑ์ ํฌ๋ฐํด ๋ณด์
๋๋ค.
๋ ๊ธ์ ์ ์ธ ์ ์ผ๋ก, ํ์ฌ ๋
ผ์์์๋ ํจ์์ ๋ชจ๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ผํ ์์น์์ ์ฅ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ต๋๋ค( defer
๋๋ goto
์ฌ์ฉ). ์ด์ ์ ๊ณ ๋ คํ์ง ์์์ผ๋ฉฐ Go ํ์ด ์ต์ํ go fmt
์ ๋ณ๊ฒฝํ์ฌ ๋จ์ผ ๋ช
๋ น๋ฌธ if
์ ํ ์ค์ ์์ฑํ์ฌ ์ ์ด๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. _look_ ์ ์ค์ ๋ก ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ผ๋ ๋ ์ปดํฉํธํฉ๋๋ค.
@ํผ์๋
1/ "์ค๋ฅ ์ฒ๋ฆฌ"๋ ์ฌ์ ํ ์ฐ๊ตฌ ์์ญ์ ๋๊น?
50๋ ์ด ๋์์ต๋๋ค! ์ผ๊ด๋๊ณ ์ฒด๊ณ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ ๋ฐ์ ์ธ ์ด๋ก ์ด๋ ์ค์ฉ์ ์ธ ์ง์นจ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋๋๋ผ(๋ค๋ฅธ ์ธ์ด์ ๊ฒฝ์ฐ)์์๋ ์ค๋ฅ๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ํผ๋๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, EOF๋ ํ์ผ์ ์ฝ์ผ๋ ค๊ณ ํ ๋ ์์ธ์ ์ธ ์กฐ๊ฑด์ผ ์ ์์ง๋ง ์ด๊ฒ์ด ์ค๋ฅ์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๊ฒ์ด ์ค์ ์ค๋ฅ์ธ์ง ์๋์ง๋ ์ค์ ๋ก ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฌํ ๋ฌธ์ ๊ฐ ๋ ์์ต๋๋ค.
์๋ง๋ ๋ ๋์ ์์ค์ ๋ ผ์๊ฐ ํ์ํ ๊ฒ์ ๋๋ค(์ฌ๊ธฐ์๋ ์๋).
@griesemer @rsc ์ ์ ์์ ๊ด๋ จ๋ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค์ด ์์์ ๋งํ๊ณ , ๋ฌธ์ ๋ฅผ ์๊ฐํ๊ณ ์ ์์๋ฅผ ์์ฑํ๊ณ ์ฑ์คํ๊ฒ ํ ๋ก ํ๋ ๊ทํ์ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@ianlancetaylor
Steve Klabnik์ ์ธ์ฉ๋ฌธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ ๊ทธ ๊ฐ์ ์ ๊ฐ์ฌํ๊ณ ๋์ํ์ง๋ง, ์ธ์ด๋ก์ Rust๊ฐ Go๋ณด๋ค ๊ตฌ๋ฌธ์ ์ธ๋ถ ์ฌํญ์ ๋ ๊ธฐ๊บผ์ด ์์กดํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ์ ์ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ Rust๊ฐ Go๋ณด๋ค ๋ฌธ๋ฒ์ ์ธ๋ถ ์ฌํญ์ ๋ ์์กดํ๋ค๋ ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ํ์ง๋ง ์ด๊ฒ์ด ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ๋ํ ์ด ํน์ ํ ๋ก ์ ์ ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค๋ฅ๋ Go์์์ ๊ฐ์ด Rust์์ ๊ฐ์
๋๋ค. Go์์์ ๊ฐ์ด ํ์ค ์ ์ด ํ๋ฆ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. Rust์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์๋ Go์์์ ๊ฐ์ด ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ try!
๋งคํฌ๋ก๋ฅผ ๋์
ํ๋๋ฐ ์ด๋ ๋๋๊ฒ๋ try
๋ด์ฅ ํจ์ ์ ์๊ณผ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ค์ ๊ฒฐ๊ตญ try!
๋งคํฌ๋ก์ ๊ตฌ๋ฌธ ๋ณํ์ด์ ์ผ๋ฐํ์ธ ?
์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ์ง๋ง try
์ ์ ์ฉ์ฑ์ ์
์ฆํ๊ธฐ ์ํด ํ์ํ์ง ์์ผ๋ฉฐ ์ฌ์ค Rust ์ปค๋ฎค๋ํฐ๋ ๊ทธ๊ฒ์ ์ถ๊ฐํ ๊ฒ์ ํํํ์ง ์์ต๋๋ค.
๋๋ Go์ Rust์ ์์ฒญ๋ ์ฐจ์ด์ ์ ์ ์๊ณ ์์ง๋ง, ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ๊ดํด์๋ ๊ทธ๋ค์ ๊ฒฝํ์ด Go๋ก ๋์ฒด๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. try!
๋ฐ ?
์ ๊ด๋ จ๋ RFC ๋ฐ ํ ๋ก ์ ์ ๋ง ์ฝ์ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ธ์ด ๋ณ๊ฒฝ์ ๋ํ ์ฐฌ์ฑ๊ณผ ๋ฐ๋์ ์์ ๊ณผ ์ฃผ์ฅ์ด ์ผ๋ง๋ ์ ์ฌํ์ง ๋ณด๊ณ ์ ๋ง ๋๋์ต๋๋ค.
@griesemer๋ , ํ์ฌ ํํ์ try
์ ์์ ๊ฑฐ๋ถํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ๋ฐํ ํ์
จ์ง๋ง Go ํ์ด ๋ค์์ ๋ฌด์์ ํ ๊ณํ์ธ์ง๋ ๋ง์ํ์ง ์์ผ์
จ์ต๋๋ค.
์ด ๋ ผ์์์ ์ ๊ธฐ๋ ๋ฌธ์ (๋๋ฒ๊น ์ธ์, ์ฝ๋ ์ ์ฉ ๋ฒ์, ๋ ๋์ ์ค๋ฅ ์ฅ์ ๋ฑ)๋ฅผ ํด๊ฒฐํ ๋ ๋ค๋ฅธ ์ ์์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ํด๊ฒฐํ ๊ณํ์ ๋๊น?
๋๋ Rust๊ฐ Go๋ณด๋ค ๋ฌธ๋ฒ์ ์ธ๋ถ ์ฌํญ์ ๋ ์์กดํ๋ค๋ ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋์ํ์ง๋ง ์ด๊ฒ์ด ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ๋ํ ์ด ํน์ ํ ๋ก ์ ์ ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ ์ฌ์ ํ โโ2์ผํธ๋ฅผ ์ถ๊ฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ ๋๊ฐ์ด ํ ์ ์๋ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
1987๋ ๋ถํฐ ํ๋ก๊ทธ๋๋ฐ์ ํด์์ง๋ง Go์ ํจ๊ป ์ผํ์ง๋ 1๋ ์ ๋๋ฐ์ ๋์ง ์์์ต๋๋ค. ์ฝ 18๊ฐ์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์๋ก์ด ์ธ์ด๋ฅผ ์ฐพ๊ณ ์์ ๋ ์ ๋ Go์ Rust๋ฅผ ๋ชจ๋ ์ดํด๋ณด์์ต๋๋ค. Go ์ฝ๋๊ฐ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๊ธฐ ํจ์ฌ ์ฝ๊ณ Go๊ฐ ๊ฐ๊ฒฐํ ๊ธฐํธ ๋์ ์๋ฏธ๋ฅผ ์ ๋ฌํ๋ ๋จ์ด๋ฅผ ์ ํธํ๋ ๊ฒ ๊ฐ์์ Go ์ฝ๋๊ฐ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ๋๊ผ๊ธฐ ๋๋ฌธ์ Go๋ฅผ ์ ํํ์ต๋๋ค.
๊ทธ๋์ ๋๋ ์๋ฏธ๋ฅผ ์์ํ๊ธฐ ์ํด ๋๋ํ( !
)์ ๋ฌผ์ํ( ?
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํฌํจํ์ฌ Go๊ฐ ๋ Rust์ฒ๋ผ ๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ด ๋งค์ฐ ๋ถํํ ๊ฒ ์
๋๋ค.
๋น์ทํ ๋งฅ๋ฝ์์ ๋งคํฌ๋ก์ ๋์ ์ ๋ฐ๋์ ์ฑ๊ฒฉ์ ๋ฐ๊พธ๊ณ ์ฌ์ค์ ๋ฃจ๋น์ ๊ฒฝ์ฐ์ฒ๋ผ ์์ฒ ๊ฐ์ ๋ฐ๋ ๋ฐฉ์ธ์ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋งคํฌ๋ก๊ฐ Go์ ์ถ๊ฐ๋์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋คํํ IMO์์๋ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ianlancetaylor
๋งค์ฐ ๋์์ด ๋๋ ๊ฒ์ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ๋ก ์ธํด ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด Go๋ฅผ ํผํ๋์ง ๋ ๋ช ํํ๊ฒ ์ดํดํ๋ ๊ฒ์ ๋๋ค. ์ซ์๊ฐ 0์ด ์๋ ๊ฒ์ ํ์คํ์ง๋ง ์ธก์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๊ทธ ์์ฒด๋ก "์ธก์ "์ ์๋์ง๋ง ์ด Hacker News ํ ๋ก ์ ์ฅํฉํจ์ผ๋ก ์ธํด Go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ถ๋ง์ ํ์ ๊ฐ๋ฐ์์ ์์ญ ๊ฐ์ ์๊ฒฌ์ ์ ๊ณตํฉ๋๋ค(์ผ๋ถ ์๊ฒฌ์ ์ด์ ๋ฅผ ์ค๋ช ํ๊ณ ์ฝ๋ ์์ ๋ฅผ ์ ๊ณตํจ): https://news.ycombinator. com/item?id=20454966.
์ฐ์ , ๊ทธ ๊ฒฐ์ ์ด ๋ง์ ์ฌ๋๋ค์๊ฒ ๋ง์กฑ์ค๋ฝ์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ์ต์ข ๊ฒฐ์ ์ ์ง์ง์ ์ธ ํผ๋๋ฐฑ์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ง์ ์ผ๋ก ํ์ ๋ ธ๋ ฅ์ด์๊ณ , ์ ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ ๋ฐ์ ์ผ๋ก ์์ ๋ฐ๋ฅด๊ณ ์กด์คํ๋ ๋ฐฉ์์ผ๋ก ๊ฒฉ๋ ฌํ ํ ๋ก ์ ์ด๊ฒจ๋ผ ์ ์์๋ ๊ฒ์ ๋ํด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
@ngrilly ๋ ์์ ์ ์ํด ๋งํด์, ๋๋ ์ฌ์ ํ ์ด๋ ์์ ์์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฅํฉํจ์ ํด๊ฒฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ฐ๋ฆฌ๋ ์ง๋ ๋ฐ๋ , ํนํ โโ์ง๋ 3๊ฐ์ ๋์ ์ด์ ๋ํด ์๋นํ ์๊ฐ๊ณผ ์๋์ง๋ฅผ ํฌ์ํ์ผ๋ฉฐ ์ ์์ ๋งค์ฐ ๋ง์กฑํ์ง๋ง ์ด์ ๋ํ ๊ฐ๋ฅํ ๋ฐ์์ ๋ถ๋ช ํ ๊ณผ์ ํ๊ฐํ์ต๋๋ค. ์ด์ ํ๋ฐ ๋ฌผ๋ฌ์์ ํผ๋๋ฐฑ์ ์์ฝํ๊ณ ์ ์ ํ ๋ค์ ์ต์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๋ํ ํ์ค์ ์ผ๋ก ๋ฆฌ์์ค๊ฐ ๋ฌด์ ํ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ธ์ด ์ง์์ ๋ํ ์๊ฐ์ ๋ค๋ฅธ ๋ถ์ผ, ํนํ ์ ๋ค๋ฆญ ์์
์ ๋ํ ๋ ๋ง์ ์ง์ ์ ์ํด ์ ์ ๋ค๋ก ๋ฌผ๋ฌ๋๋ ๊ฒ์ ๋ด
๋๋ค. ์์ผ๋ก ๋ช ๊ฐ์. if err != nil
์ฑ๊ฐ์ค ์ ์์ง๋ง ๊ธด๊ธ ์กฐ์น์ ์ด์ ๋ ์๋๋๋ค.
ํ ๋ก ์ ๊ณ์ํ๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ์์ ๋ฒ์ด๋ ๋ค๋ฅธ ๊ณณ, ๋ณ๋์ ๋ฌธ์ (๋ช ํํ ์ ์์ด ์๋ ๊ฒฝ์ฐ) ๋๋ ๊ณต๊ฐ ํ ๋ก ์ ๋ ์ ํฉํ ๋ค๋ฅธ ํฌ๋ผ์์ ํ ๋ก ์ ๊ณ์ํ ๊ฒ์ ๋ชจ๋์๊ฒ ๋ถ๋๋ฝ๊ฒ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ์ข ๋ฃ๋์์ต๋๋ค. ๊ฐ์ฌ ํด์.
์๊ธฐ ์ ํ ํธํฅ์ด ์๋ ๊ฒ ๊ฐ์์.
์ ๋ ์ง๊ธ ์ฌ๊ธฐ์์ "ํฌ๋ฆฌ์์ดํฐ ํธํฅ"์ด๋ผ๋ ์๋ก์ด ์ฉ์ด๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๊ธฐ๊บผ์ด ์ผ์ ํ๋ค๋ฉด ์์ฌ์ ์ฌ์ง๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ ์ฝฉ ๊ฐค๋ฌ๋ฆฌ๊ฐ ๊ด๋ จ ์๋ ํฌ๋ผ์์ ๋ฌธ์ ์ ๋ํ ์ ์๋ ์๋ฃจ์ ์ ์ผ๋ง๋ ์ซ์ดํ๋์ง ํฐ์๋ฆฌ๋ก ์ธ์น๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ํ ๋ชจ๋ ์ฌ๋์ด ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ํ 3๊ฐ์ ๋จ๋ฝ์ผ๋ก ๋ ๋ถ์์ ํ ์๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๋งค์ฐ ์ฝ์ต๋๋ค(์ค์ ์์ ์ ์ ์ธ). ํ์ ์ ์ง์ ๋์ํ๋ฉด OK์ ๋๋ค. ๊ณต์ ํ ์ง์ ์ ๋๋ค. ์์ ํ ์ ์ ์์ด ์๋ฃจ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ์ ์ ์ํ๋ฉด -10k ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋๋ ์๋๋ฅผ ์ง์งํ๊ฑฐ๋ ๋ฐ๋ํ์ง ์์ง๋ง ์ด ๋ฌธ์ ์ ๋ํ Go Teams์ ํ๋จ์ ์ ๋ขฐํฉ๋๋ค. ์ง๊ธ๊น์ง ๊ทธ๋ค์ ํ๋จ์ ํ๋ฅญํ ์ธ์ด๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ด ๊ฒฐ์ ํ ๊ฒ์ด ๋ฌด์์ด๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ ํ์ง ์๋ ์ฐ๋ฆฌ๋ ์ธ๋ถ์ธ์ผ๋ก์ ์ ์ง ๊ด๋ฆฌ์๊ฐ ๋ฌธ์ ์ ๋ํด ๋ ๋์ ๊ฐ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์ดํดํ ํ์๊ฐ ์์ต๋๋ค. ํ๋ฃจ ์ข ์ผ ํ ๋ก ํ ์ ์๋ ๊ตฌ๋ฌธ์ ๋๋ค. ๋๋ ๊ทธ๋ค์ ๋ ธ๋ ฅ์ ๋ํด ํ์ฌ ์์ ์ ์งํํ๊ฑฐ๋ ๊ฐ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๊ฐ์ฌํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ์ฌํ๊ณ ๊ณ ๋ ค๋๋ ๊ฒฝ์ฐ ์ธ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋ฐํ์์ ์๋ก์ด(์ญ์ ์ด ์๋) ๊ฐ์ ์ฌํญ์ ๊ธฐ๋ํฉ๋๋ค. ์ ์ฉํฉ๋๋ค.
๋ํ ๋ชจ๋ ์ฌ๋์ด ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ํ 3๊ฐ์ ๋จ๋ฝ์ผ๋ก ๋ ๋ถ์์ ํ ์๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๋งค์ฐ ์ฝ์ต๋๋ค(์ค์ ์์ ์ ์ ์ธ).
๋์ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค์ด try
๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋ค๊ณ ์ถ์๋ ๊ฒ์ ๋ณ๊ฒฝ๋์ง ์์ ์ค๋ฅ ๋์ ๋ํ๋ ๋ฒ์ ์ ์ค๋ฅ๋ฅผ ๋ฐํํ ์ ์๋๋ก ํ๋ ์ ํ์ ์ธ์์์ต๋๋ค. ๋ง์ ์์ ๋์์ธ ์์
์ด ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ผ.
๋ด๊ฐ ์ฐธ์กฐ. ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅธ ๊ฒ์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
๋๊ตฐ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ฐ์ผ ํ ๊น์? ํ ๋ก ์ ์๋ง๋ ๋ค๋ฅธ ๊ณณ์์ ๋ ์ ํฉํ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ฏธ ๋๋ฌด ๊ธธ์ด์ ์ ๊ทธ๋ ๊ฒ์ด ๋ฌด์๋ฏธํด ๋ณด์ ๋๋ค.
์ฌ๋ฌ๋ถ, ์ด ๋ฌธ์ ๋ ์ข ๋ฃ๋์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์์ฑํ๋ ์๊ฒฌ์ ๊ฑฐ์ ์์ํ ๋ฌด์๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ ์ํ์ญ์์ค. ๊ด์ฐฎ์ผ์๋ค๋ฉด ๋๊ธ์ ๋ฌ์์ฃผ์ธ์.
๋๊ตฐ๊ฐ๊ฐ Java, C* ์ธ์ด๋ฅผ ์๊ฐํ๊ฒ ํ๋ try ๋จ์ด๋ฅผ ์ซ์ดํ๋ค๋ฉด 'try'๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ 'help' ๋๋ 'must' ๋๋ 'checkError'์ ๊ฐ์ ๋ค๋ฅธ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. (๋ฌด์)
๋๊ตฐ๊ฐ๊ฐ Java, C* ์ธ์ด๋ฅผ ์๊ฐํ๊ฒ ํ๋ try ๋จ์ด๋ฅผ ์ซ์ดํ๋ค๋ฉด 'try'๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ 'help' ๋๋ 'must' ๋๋ 'checkError'์ ๊ฐ์ ๋ค๋ฅธ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. (๋ฌด์)
C ๊ณ์ด ์ธ์ด์ ๊ฐ์ด ์๋ก ํฉ๋ฆฌ์ ์ผ๋ก ๊ฐ๊น์ด ์ธ์ด์์ ํฌ๊ฑฐ๋ ์์ ์๋ฏธ ์ฐจ์ด๊ฐ ์๋ ๊ฒน์น๋ ํค์๋์ ๊ฐ๋ ์ด ํญ์ ์์ต๋๋ค. ์ธ์ด ๊ธฐ๋ฅ์ ์ธ์ด ์์ฒด ๋ด์์ ํผ๋์ ์ผ์ผํค์ง ์์์ผ ํ๋ฉฐ ์ธ์ด ๊ฐ์ ์ฐจ์ด๋ ํญ์ ๋ฐ์ํฉ๋๋ค.
๋์. ์ด๊ฒ์ ์ํฐ ํจํด์ ๋๋ค. ํด๋น ์ ์์ ์์ฑ์๋ฅผ ๋ฌด์ํฉ๋๋ค.
@alersenkevich ์ ์คํ ๋ถํ๋๋ฆฝ๋๋ค. https://golang.org/conduct๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ ์ด์ ์งํํ์ง ์๊ธฐ๋ก ํ ๊ฒฐ์ ์ ๋ํด ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค. ๋์๊ฒ ์ด๊ฒ์ if err != nil ์ด ์ฌ๋ฌ ์ค์ ์๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋น ๋ฅธ ํดํน์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ์ ์ฌ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ํ ํค์๋๋ก Go๋ฅผ ๋ถํ๋ฆฌ๊ณ ์ถ์ง ์์ต๋๊น? ์ด๊ฒ์ด ์์์ ์ธ โโ๋งคํฌ๋ก https://github.com/golang/go/issues/32620 ์ ์์ด ๋ ์ข๊ฒ ๋๊ปด์ง๋ ์ด์ ์ ๋๋ค. ๋ ๋ง์ ๊ฒ๋ค์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ ์ผ๋ฐ์ ์ธ ์๋ฃจ์ ์ ์๋ํฉ๋๋ค. ๊ฑฐ๊ธฐ์์ ๊ตฌ๋ฌธ ๋ฐ ์ฌ์ฉ๋ฒ์ ๋ํ ๋ ผ์๊ฐ ์งํ ์ค์ด๋ฏ๋ก C/C++ ๋งคํฌ๋ก๋ผ๊ณ ๋ง ์๊ฐํ์ง ๋ง์ญ์์ค. ์ฌ๊ธฐ์ ์์ ์ ๋งคํฌ๋ก๋ฅผ ์ํํ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ผ๋ก, ๋น์ ์ ๋น์ ์ ์์ ์ ์๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์์งํ ์ด๊ฒ์ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ์ค์์ ์ด๊ฒ์ด ๊ฐ์ฅ ์ ์ ์ ์ธ ์ ์์ ๋๋ค.
@OneOfOne ์ ์คํ๊ฒ, ๋๋ ์ด๊ฒ์ด ์ฌ๊ฐ๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ์ด ์ค๋ ๋๋ ๊ตฌ๋ฌธ์ ์ค์ ์ ํ์ด ์์์ ํ์ธํ์ต๋๋ค. ์๋ง๋ ์ด๊ฒ์ด ๊ฐ์ฅ "์ ๋นํ" ์ ์์ด๋ผ๋ ๋น์ ์ ์๊ฐ์ด ์ณ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ํ์ ์ ์ง๊ฐ ์ฌ์ ํ ๋ ์ ์์ ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
if err != nil
๊ฐ Go-์์ ๋๋ฌด ์์ฃผ ์์ฑ๋๋ค๋ ๋ฐ ๋์ํ์ง๋ง ํจ์์์ ๋ฐํํ๋ ๋จ์ผ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋
์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๋ ์ ์์ ํ ์ ์์ง๋ง ๋น์ฉ์ ๊ฐ๋
์ฑ IMHO๊ฐ๋์ด์๋ ์๋ฉ๋๋ค .
๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ด๋ ์ค์ "์ฅ๊ธฐ์ ์ธ" ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ํํํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์์งํ ๊ฐ๊ฒฐํจ์ ์ข ์ข ๊ฐ๋ ์ฑ๊ณผ ์์ถฉ๋ฉ๋๋ค. Go๋ ํน์ ์์ ๋ฐฉ์์ ๊ถ์ฅํ๋ ์ฌ๋ฌ ํ๋ฆฝ๋ ํจํด์ ์ฌ๊ธฐ์ ๊ธฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ฒฐ๊ณผ๋ ์ค๋ ์ง์๋๋ ์์ ์ ์ธ ์ฝ๋์ ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค์ ์ฝ๋๋ ํ์ ๋์ ์ฌ๋ฌ ๋ฒ ์ฝ๊ณ ์ดํดํด์ผ ํ์ง๋ง ํ ๋ฒ๋ง ์์ฑ๋ฉ๋๋ค. ์ธ์ง ์ค๋ฒํค๋๋ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์์๊ฒ๋ ์ค์ง์ ์ธ ๋น์ฉ์ ๋๋ค.
๋์ ์:
f := try(os.Open(filename))
๋๋ ๊ธฐ๋ํ๋ค:
f := try os.Open(filename)
์ฌ๋ฌ๋ถ, ์ด ๋ฌธ์ ๋ ์ข ๋ฃ๋์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์์ฑํ๋ ์๊ฒฌ์ ๊ฑฐ์ ์์ํ ๋ฌด์๋ ๊ฒ์ด๋ผ๋ ์ ์ ์ ์ํ์ญ์์ค. ๊ด์ฐฎ์ผ์๋ค๋ฉด ๋๊ธ์ ๋ฌ์์ฃผ์ธ์.
โ@ianlancetaylor
์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ํ์ฌ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์ฝ๋ ๋ธ๋ก์ ๋ํด try๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
์ด ๊ฐ์:
// Generic Error Handler
handler := func(err error) error {
return fmt.Errorf("We encounter an error: %v", err)
}
a := "not Integer"
b := "not Integer"
try(handler){
f := os.Open(filename)
x := strconv.Atoi(a)
y, err := strconv.Atoi(b) // <------ If you want a specific error handler
if err != nil {
panic("We cannot covert b to int")
}
}
์์ ์ฝ๋๋ ์ด๊ธฐ ์ฃผ์๋ณด๋ค ๊น๋ํด ๋ณด์ ๋๋ค. ๋๋ ์ด๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ์๋ก์ด ์ ์์ ํ๋ค #35179
val := f()๋ฅผ ์๋(์ค๋ฅ){
ํจ๋(์ค๋ฅ)
}
๋๋ ํฌ๋งํ๋ค:
i, err := strconv.Atoi("1")
if err {
println("ERROR")
} else {
println(i)
}
๋๋
i, err := strconv.Atoi("1")
if err {
io.EOF:
println("EOF")
io.ErrShortWrite:
println("ErrShortWrite")
} else {
println(i)
}
@myroid ๋ ๋ฒ์งธ ์์ ๋ฅผ switch-else
๋ฌธ ํ์์ผ๋ก ์กฐ๊ธ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง๋๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๊ฒ ์ต๋๋ค.
```๊ฐ๋ค
i, err := strconv.Atoi("1")
์ค์์น ์ค๋ฅ != nil; ์ค๋ฅ {
์ผ์ด์ค io.EOF:
println("EOF")
์ผ์ด์ค io.ErrShortWrite:
println("ErrShortWrite")
} ๋ ๋ค๋ฅธ {
println(i)
}
@piotrkowalczuk ๊ทํ์ ์ฝ๋๋ ๋ด ๊ฒ๋ณด๋ค ํจ์ฌ ์ข์ ๋ณด์ ๋๋ค. ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
i, err := strconv.Atoi("1")
switch err {
case io.EOF:
println("EOF")
case io.ErrShortWrite:
println("ErrShortWrite")
} else {
println(i)
}
์ด๊ฒ์ ๋ค๋ฅธ ์ ํ์ ๋์ด์์ ์ต์ ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
์์ ํ์๊ฐ์๋ค
์ผ์ด์ค ์ค๋ฅ!=์์
๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ์บก์ฒํ์ง ์์ ์ค๋ฅ์ ๊ฒฝ์ฐ
2019๋ 11์ 8์ผ ๊ธ์์ผ, 12:06 Yang Fan, [email protected] ์์ฑ:
@piotrkowalczuk https://github.com/piotrkowalczuk ์ฝ๋๊ฐ ๋ง์ด ๋ณด์ ๋๋ค.
๋๋ณด๋ค ๋ซ๋ค. ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.i, err := strconv.Atoi("1")switch err {์ผ์ด์ค io.EOF:
println("EOF") ์ผ์ด์ค io.ErrShortWrite:
println("ErrShortWrite")
} ๋ ๋ค๋ฅธ {
println(i)
}โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4VH4KS2OX4M5BVH673QSU24DA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVEXG43VMVBW63
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/ABNEY4W4XIIHGUGIW2KXRPTQSU24DANCNFSM4HTGCZ7Q
.
switch
์๋ else
๊ฐ ํ์ํ์ง ์๊ณ default
๊ฐ ์์ต๋๋ค.
Swift์ guard
์ ์ ์ฌํ ๊ฒ์ ์ ์ํ๋ https://github.com/golang/go/issues/39890 ์ ์ด์์ต๋๋ค. ์ด ์ ์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๊ทธ๋ค์ง ์ฃผ๋ชฉ์ ๋ฐ์ง๋ ๋ชปํ์ง๋ง ์ฌ๊ธฐ์ ๋๊ธ์ ๋จ๊ธด ์ฌ๋๋ค์๊ฒ๋ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์ด์ ๊ฐ์ ์ ์์ ๋ํ ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์๋ฏธ, ์ ์ถฉ์ ๋ฐ ์งํ ๋ฐฉ๋ฒ์ ๋ํด ์ปค๋ฎค๋ํฐ ์ ์ฒด์ ํ ๋ก ์ ํ๊ณ , ๊ทธ ํ ๋ก ์ ์ฌ์ฉํ์ฌ ์์ผ๋ก์ ๊ธธ์ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ ๋๋ค.
์๋์ ์ธ ์ปค๋ฎค๋ํฐ ๋ฐ์๊ณผ ์ฌ๊ธฐ์์์ ๊ด๋ฒ์ํ ํ ๋ก ์ ๋ฐํ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ด ์ ์์ด ์์ ๋ณด๋ค ๋นจ๋ฆฌ ๊ฑฐ์ ๋ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค.
๊ธฐ์ ํผ๋๋ฐฑ๊ณผ ๊ด๋ จํ์ฌ ์ด ํ ๋ก ์์๋ ์ฐ๋ฆฌ๊ฐ ๋์น ๋ช ๊ฐ์ง ์ค์ํ ๊ณ ๋ ค ์ฌํญ, ํนํ ๋๋ฒ๊น ์ธ์ ์ถ๊ฐ ๋ฐ ์ฝ๋ ์ ์ฉ ๋ฒ์ ๋ถ์์ ๋ํ ์๋ฏธ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค.
๋ ์ค์ํ ๊ฒ์, ์ฐ๋ฆฌ๋ ์ด ์ ์์ด ๊ฐ์น ์๋ ๋ฌธ์ ๋ฅผ ๊ฒจ๋ฅํ ๊ฒ์ด ์๋๋ผ๊ณ ์ฃผ์ฅํ๋ ๋ง์ ์ฌ๋๋ค์ ๋ถ๋ช ํ ๋ค์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ Go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋ฒฝํ์ง ์๊ณ ์๋ฏธ ์๊ฒ ๊ฐ์ ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ปค๋ฎค๋ํฐ๋ก์ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํน์ ์ธก๋ฉด์ ๋ํด ๋ ๋ง์ด ์ด์ผ๊ธฐํด์ผ ํ๋ค๋ ๊ฒ์ ๋ถ๋ช ํฉ๋๋ค.
ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ๋ ๋งํผ ์ง๋ 8์ " Go 2 ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ์ "์์ ๋ฌธ์ ์ ๋ํ ๋น์ ์ ์ ์ํ๋ ค๊ณ ํ์ง๋ง ๋์ด์ผ๋ณด๋ฉด ๊ทธ ๋ถ๋ถ์ ๋ํด ์ถฉ๋ถํ ๊ด์ฌ์ ๊ธฐ์ธ์ด์ง ์์๊ณ ์ถฉ๋ถํ ์ฅ๋ คํ์ง ์์์ต๋๋ค. ํน์ ๋ฌธ์ ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์ ์ธ์ง์ ๋ํ ํ ๋ก .
try
์ ์์ ๊ฑฐ๊ธฐ์ ์ค๋ช ๋ ๋ฌธ์ ์ ๋ํ ํ๋ฅญํ ํด๊ฒฐ์ฑ ์ผ ์ ์์ง๋ง ๋ง์ ์ฌ๋๋ค์๊ฒ ๋จ์ํ ํด๊ฒฐํ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์์ผ๋ก ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ด๊ธฐ ๋ฌธ์ ์ง์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์ ๋ํ ๊ด๋ฒ์ํ ๋์๊ฐ ์๋์ง ํ์ธํ๋ ์์ ์ ๋ ์ ์ํํด์ผ ํฉ๋๋ค.(๊ฐ์ ๋ ์ ๋ค๋ฆญ ๋์์ธ ๋๋ํํธ๋ฅผ ๊ณต๊ฐํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ์ค๋ช ์ ์์ ํ ์ ์คํ ์ด์งํ์ ์๋ ์์ต๋๋ค.)
Go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๊ฐ์ ํด์ผ ํ ์ฌํญ์ ๋ํ ๊ด๋ฒ์ํ ์ฃผ์ ์์ Go์ ์ค๋ฅ ์ฒ๋ฆฌ ์ธก๋ฉด์ด ๊ทํ์ ์ฝ๋๋ฒ ์ด์ค ๋ฐ ์์ ํ๊ฒฝ์์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๊ณ ์ข์ ์๋ฃจ์ ์ด ์ผ๋ง๋ ํฐ ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ๋ณด๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ์์ ์ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ Go2ErrorHandlingFeedback ํ์ด์ง ์ ๋งํฌ๋ฅผ ๊ฒ์ํ์ญ์์ค.
์ฌ๊ธฐ์ ๋ค๋ฅธ ๊ณณ์์ ์ด ํ ๋ก ์ ์ฐธ์ฌํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Russ Cox๊ฐ ์ด์ ์ ์ง์ ํ๋ฏ์ด ์ด์ ๊ฐ์ ์ปค๋ฎค๋ํฐ ์ ์ฒด ํ ๋ก ์ ์ต๊ณ ์ ์คํ ์์ค ์ ๋๋ค. ์ด ํน์ ์ ์์ ๊ฒํ ํ๊ณ ๋ ์ผ๋ฐ์ ์ผ๋ก Go์์ ์ค๋ฅ ์ฒ๋ฆฌ ์ํ๋ฅผ ๊ฐ์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ ผ์ํ๋ ๋ฐ ๋์์ ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ ์ ๊ฒํ ์์ํ์ ๋ก๋ฒํธ ๊ทธ๋ฆฌ์ฆ๋จธ(Robert Griesemer).