Go 프로그램의 일반 패닉 복구
Go 루틴을 사용할 때 충돌이나 패닉을 포착하고 처리하고 싶은 경우가 있을 수 있습니다. 잠재적으로 Sentry 또는 Raygun과 같은 오류 보고 서버에 보고하기 위해 발생합니다. 그러나 고루틴은 다른 고루틴의 패닉에서 복구할 수 없다는 점에 유의하는 것이 중요합니다.
관용적인 접근 방식
이를 처리하는 관용적인 방법은 코드를 고루틴으로 실행되는 함수입니다. 여기에는 패닉 상태에서 복구할 수 있는 기능을 제공하는 복구()를 호출하는 지연 함수 활용이 포함됩니다.
다음 예를 고려하세요.
go func() { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() panic("catch me") }()
이 코드는 관련 패닉 상태를 출력합니다.
실행하는 모든 고루틴에서 이 접근 방식을 구현하는 것은 비현실적이지만 다음과 같은 명명된 함수를 정의하여 프로세스를 단순화할 수 있습니다. 복구 기능이 포함되어 있으며 고루틴 내에서 해당 함수를 호출합니다(지연 호출 사용).
func logger() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }
지연 클로저 내에서 이 함수를 호출하면 패닉 상황을 간결하게 처리할 수 있습니다.
go func() { defer logger() panic("catch me") }()
래퍼 기능
더욱 편리하게 실제 함수를 입력으로 사용하고 패닉 복구 프로세스를 관리하는 래퍼 함수를 만듭니다. 이 래퍼 기능은 다음과 같이 활용할 수 있습니다.
func wrap(f func()) { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() f() }
이 래퍼를 사용하면 패닉 처리 프로세스가 더욱 단순화됩니다.
go wrap(func() { panic("catch me") })
추가 고려 사항
제공된 예제 코드는 Wrap() 함수 내에서 고루틴이 시작되는 상황을 보여줍니다. 이를 통해 호출자는 go 키워드를 사용하여 Wrap() 호출을 선행하여 새로운 고루틴이 필요한지 여부를 결정할 수 있습니다. 그러나 새로운 고루틴에서 동시에 실행하고 싶지 않은 경우에도 입력으로 전달된 임의 함수의 실행을 보호하기 위해 Wrap() 함수를 사용할 수도 있습니다.
위 내용은 Go Goroutines에서 패닉을 어떻게 복구할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!