本文介紹Go運行環境的錯誤處理相關內容。
發生異常時,函數調用響應的HTTP Header中會包含X-Fc-Error-Type
,例如X-Fc-Error-Type: UnhandledInvocationError
。Function Compute的錯誤類型的更多資訊,請參見錯誤處理。
Function Compute返回錯誤資訊的方式如下。
- 在入口函數直接返回錯誤資訊,樣本如下。
package main import ( "errors" "fmt" "github.com/aliyun/fc-runtime-go-sdk/fc" ) func HandleRequest() error { fmt.Println("hello world") return errors.New("something is wrong") } func main() { fc.Start(HandleRequest) }
調用函數時收到的響應如下所示。
{ "errorMessage": "something is wrong!", "errorType": "errorString" }
- 使用panic拋出錯誤資訊,樣本如下。
package main import ( "fmt" "github.com/aliyun/fc-runtime-go-sdk/fc" ) func HandleRequest() error { fmt.Println("hello world") panic("Error: something is wrong") return nil } func main() { fc.Start(HandleRequest) }
調用函數時收到的響應如下所示(樣本中省略了部分堆棧資訊)。
{ errorMessage: 'Error: something is wrong', errorType: 'string', stackTrace: [ { path: 'github.com/aliyun/fc-runtime-go-sdk/fc/errors.go', line: 39, label: 'fcPanicResponse' }, { path: 'github.com/aliyun/fc-runtime-go-sdk/fc/function.go', line: 84, label: '(*Function).Invoke.func1' }, ... ... ... { path: 'code/main.go', line: 22, label: 'main' }, { path: 'runtime/proc.go', line: 255, label: 'main' }, { path: 'runtime/asm_amd64.s', line: 1581, label: 'goexit' } ] }
- 建議不要使用包含
os.Exit(1)
代碼的錯誤處理代碼,例如log.Fatal
。重要 使用該方法無法擷取退出時的報錯資訊和堆棧資訊。package main import ( "fmt" "log" "github.com/aliyun/fc-runtime-go-sdk/fc" ) func HandleRequest() error { fmt.Println("hello world") log.Fatal("something is wrong") return nil } func main() { fc.Start(HandleRequest) }
調用函數時收到的響應如下所示。
{ errorMessage: 'Process exited unexpectedly before completing request (duration: 0ms, maxMemoryUsage: 8MB)' }