코드 실행 오류로 인해 런타임 계층에서 발생하는 패닉 크래시이든, 적극적으로 트리거되는 패닉 크래시이든, 지연 및 복구를 사용하여 오류 캡처 및 복구를 구현하여 코드가 계속 실행되도록 할 수 있습니다. 충돌.
Go에는 예외 시스템이 없습니다. 가동 중지 시간을 유발하기 위해 패닉을 사용하는 것은 다른 언어에서 예외를 발생시키는 것과 유사하므로, 복구의 가동 중지 시간 복구 메커니즘은 try/catch 메커니즘에 해당합니다.
충돌 시 프로그램이 계속 실행되도록 합니다.
다음 코드는 익명 함수 또는 종료 후 실행 함수를 전달하는 ProtectRun() 함수를 구현합니다. 들어오는 함수가 어떤 형태로든 패닉이 발생하고 충돌이 발생하면 충돌이 발생했을 때 발생한 오류를 인쇄하는 동시에 전체 프로세스를 충돌시키지 않고 후속 코드가 계속 실행되도록 할 수 있습니다.
보호된 실행 함수:
package main import ( "fmt" "runtime" ) // 崩溃时需要传递的上下文信息 type panicContext struct { function string // 所在函数 } // 保护方式允许一个函数 func ProtectRun(entry func()) { // 延迟处理的函数 defer func() { // 发生宕机时,获取panic传递的上下文并打印 err := recover() switch err.(type) { case runtime.Error: // 运行时错误 fmt.Println("runtime error:", err) default: // 非运行时错误 fmt.Println("error:", err) } }() entry() } func main() { fmt.Println("运行前") // 允许一段手动触发的错误 ProtectRun(func() { fmt.Println("手动宕机前") // 使用panic传递上下文 panic(&panicContext{ "手动触发panic", }) fmt.Println("手动宕机后") }) // 故意造成空指针访问错误 ProtectRun(func() { fmt.Println("赋值宕机前") var a *int *a = 1 fmt.Println("赋值宕机后") }) fmt.Println("运行后") }
코드 설명:
9행에서는 오류를 설명하는 구조체를 선언하고 멤버들은 잘못된 실행 함수를 저장합니다.
Line 17은 defer를 사용하여 클로저 실행을 지연시킵니다. 패닉으로 인해 충돌이 발생하면 ProtectRun() 함수가 실행을 종료하고 defer 이후의 클로저가 호출됩니다.
라인 20, Recover()는 패닉에 의해 전달된 매개변수를 얻습니다.
라인 22, 스위치를 사용하여 err 변수에 대한 유형 어설션을 수행합니다.
라인 23, 오류가 널 포인터 액세스, 0으로 나누기 등과 같이 런타임 계층에서 발생하는 런타임 오류인 경우 런타임 오류를 인쇄합니다.
라인 25, 기타 오류, 전달된 오류 데이터를 인쇄합니다.
라인 44에서 패닉을 사용하여 수동으로 오류를 발생시키고 구조에 첨부된 정보를 전달합니다. 이때 복구는 구조 정보를 가져와서 인쇄합니다.
라인 57은 코드의 null 포인터 할당으로 인해 발생한 오류를 시뮬레이션합니다. 이때 오류는 런타임 레이어에서 발생하고 ProtectRun() 함수의 Recover() 함수에 의해 캡처됩니다.
패닉과 복구의 관계
패닉과 지연의 조합에는 다음과 같은 특징이 있습니다.
패닉이 있지만 복구가 없으면 프로그램이 중단됩니다.
패닉 및 복구 캡처가 있으므로 프로그램이 충돌하지 않습니다. 해당 defer를 실행한 후, crash 지점에서 현재 함수를 종료하고 실행을 계속합니다.
더 많은 golang 지식을 알고 싶으시면 PHP 중국어 홈페이지의 golang tutorial 칼럼을 주목해주세요.
위 내용은 golang에서 예기치 않은 충돌을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!