全部產品
Search
文件中心

Function Compute:錯誤處理

更新時間:Jul 06, 2024

本文介紹Go運行環境的錯誤處理相關內容。

發生異常時,函數調用響應的HTTP Header中會包含X-Fc-Error-Type,例如X-Fc-Error-Type: UnhandledInvocationErrorFunction 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)'
    }