Goμμ κ³ λ£¨ν΄ λ΄μμ panicμ΄ λ°μνλ©΄, μ΄ panicμ κ³ λ£¨ν΄μ μμ±ν λΆλͺ¨ ν¨μλ‘ μ νλμ§ μμ΅λλ€.
λΆλͺ¨ ν¨μμ recover λ‘μ§μ΄ μ‘΄μ¬ν΄λ κ³ λ£¨ν΄ λ΄μμ λ°μν panicμ μ‘μ§ λͺ»νκ³ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’ λ£λ©λλ€.
μ΄λ¬ν νμμ΄ λ°μνλ μ΄μ λ κ³ λ£¨ν΄ λ΄μμ panicμ΄ λ°μν κ²½μ°, panicking μνκ° λΆλͺ¨ κ³ λ£¨ν΄μ μ νλμ§ μκΈ° λλ¬Έμ λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
κ° κ³ λ£¨ν΄λ§λ€ panicμ κ°λ³μ μΌλ‘ μ²λ¦¬νκ³ μ μ ν 볡ꡬνλ©΄ λ©λλ€.
νμ§λ§, κ³ λ£¨ν΄λ§λ€ recover λ‘μ§μ ꡬννλ κ²μ λ²κ±°λ‘μ΅λλ€. κ·Έλμ safego ν¨ν€μ§λ₯Ό λ§λ€μμ΅λλ€.
safego ν¨ν€μ§λ κ³ λ£¨ν΄ λ΄μμ λ°μν panicμ λΆλͺ¨ ν¨μλ‘ μμ νκ² μ λ¬ν μ μλ λ°©λ²μ μ 곡ν©λλ€.
μλ λ€μ΄μ΄κ·Έλ¨μ safego.WaitGroup
μ ν΅μ¬ λμ μ리λ₯Ό μκ°μ μΌλ‘ μ€λͺ
ν©λλ€.
-
safego ν¨ν€μ§λ₯Ό μ¬μ©νλ©΄ panic λ°μ μ WaitGroupκ³Όμ μ°λ λ¬Έμ λ₯Ό μμ νκ² μ²λ¦¬ν μ μμ΅λλ€.
-
wg.Done() νΈμΆ μ νμ λ°μνλ panic μν© λͺ¨λμμ κ³ λ£¨ν΄μ΄ μ μμ μΌλ‘ μ’ λ£λλλ‘ λ³΄μ₯ν©λλ€.
-
λͺ¨λ κ³ λ£¨ν΄μ΄ μ’ λ£λ λκΉμ§ κΈ°λ€λ¦¬κ³ , λ°μν panicμ ν λ²μ μ²λ¦¬ν μ μμ΅λλ€.
- SafeGo λ©μλλ μλ‘μ΄ κ³ λ£¨ν΄μ μμνκ³ , κ³ λ£¨ν΄ λ΄μμ panicμ΄ λ°μνλ©΄ μ΄λ₯Ό μ±λμ ν΅ν΄ μμ§ν©λλ€.
- Wait λ©μλλ λͺ¨λ κ³ λ£¨ν΄μ΄ μλ£λ λκΉμ§ λκΈ°νκ³ , μ±λμ ν΅ν΄ μμ§λ λͺ¨λ panicμ λ€μ panicμΌλ‘ λ°μμν΅λλ€.
- ν μ€νΈ μΌμ΄μ€λ panic λ°μ μ¬λΆμ λ°λΌ Wait λ©μλμ λμμ κ²μ¦ν©λλ€.
package safego
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestWaitGroup_NoError_Case(t *testing.T) {
// Given
as := assert.New(t)
var wg WaitGroup
// When
wg.SafeGo(func() {
// μ μμ μΌλ‘ μ€νλλ ν¨μ, ν¨λ μμ
})
// Then
as.NotPanics(wg.Wait)
}
func TestWaitGroup_WithPanic_Case(t *testing.T) {
// Given
as := assert.New(t)
var wg WaitGroup
// When
wg.SafeGo(func() {
panic("test panic") // μ¬κΈ°μ ν¨λ λ°μ
})
// Then
as.Panics(wg.Wait) // Wait νΈμΆ μ ν¨λμ΄ λ°μνλμ§ ν
μ€νΈ
}
Done λ©μλ μ§μ νΈμΆ κΈμ§
, SafeGoλ₯Ό μ¬μ©νλ κ³ λ£¨ν΄ λ΄μμλ wg.Done()μ μ§μ νΈμΆνμ§ μλλ‘ μ£ΌμνμΈμ.- SafeGoκ° μ΄λ₯Ό μλμΌλ‘ μ²λ¦¬νκΈ° λλ¬Έμ μ€λ³΅ νΈμΆ μ WaitGroup μΉ΄μ΄ν°κ° μλͺ» κ΄λ¦¬λ μ μμ΅λλ€.