O Function Compute expõe erros do runtime Go no corpo da resposta e nos cabeçalhos HTTP. Para detectar erros, verifique o cabeçalho de resposta X-Fc-Error-Type — por exemplo, X-Fc-Error-Type: UnhandledInvocationError. Para obter a lista completa de tipos de erro, consulte a seção Tratamento de erros no tópico Conceitos básicos.
O runtime Go oferece três formas de retornar informações de erro em uma função handler.
Formato da resposta de erro
Cada método gera uma estrutura diferente no corpo da resposta:
|
Método |
** |
** |
** |
|
Retorno de |
String de erro |
Tipo de erro Go (ex.: |
Não incluído |
|
Chamada de |
Valor do panic |
Tipo Go do valor do panic (ex.: |
Incluído |
|
Chamada de |
Mensagem genérica de saída do processo |
Não incluído |
Não incluído |
Retornar um erro no handler
Retorne um valor error diretamente na função handler. O SDK captura o erro e o serializa no corpo da resposta.
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)
}
Corpo da resposta:
{
"errorMessage": "something is wrong!",
"errorType": "errorString"
}
Usar panic
Use panic quando precisar incluir um stack trace na resposta. O SDK intercepta o panic e serializa a pilha da goroutine no array stackTrace.
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)
}
Corpo da resposta (alguns frames da pilha omitidos):
{
"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" }
]
}
Evitar os.Exit e log.Fatal
Não use os.Exit(1) nem funções que o encapsulem, como log.Fatal. Se o processo terminar dessa forma, o runtime não conseguirá retornar uma mensagem de erro ou stack trace. O sistema devolverá apenas uma mensagem genérica de saída do processo, o que dificulta a depuração.
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)
}
Corpo da resposta:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 0ms, maxMemoryUsage: 8MB)"
}
Os campos errorType e stackTrace não estão incluídos.