Function Compute expose les erreurs d'exécution Go dans le corps de la réponse et les en-têtes HTTP. Pour détecter une erreur, vérifiez l'en-tête de réponse X-Fc-Error-Type, par exemple X-Fc-Error-Type: UnhandledInvocationError. Pour consulter la liste complète des types d'erreurs, reportez-vous à la section Gestion des erreurs de la rubrique Concepts de base.
L'environnement d'exécution Go offre trois méthodes pour renvoyer des informations d'erreur depuis une fonction de gestionnaire.
Format de réponse d'erreur
Chaque méthode génère une structure de corps de réponse différente :
| Méthode | **errorMessage** |
**errorType** |
**stackTrace** |
|---|---|---|---|
Renvoi d'une error depuis le gestionnaire |
Chaîne d'erreur | Type d'erreur Go (ex. : errorString) |
Non inclus |
Appel de panic |
Valeur du panic | Type Go de la valeur du panic (ex. : string) |
Inclus |
Appel de os.Exit / log.Fatal |
Message générique de fin de processus | Non inclus | Non inclus |
Renvoyer une erreur depuis le gestionnaire
Renvoyez directement une valeur error depuis la fonction de gestionnaire. Le SDK capture cette erreur et la sérialise dans le corps de la réponse.
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)
}
Corps de la réponse :
{
"errorMessage": "something is wrong!",
"errorType": "errorString"
}
Utiliser panic
Appelez panic lorsque la réponse doit inclure une trace de pile. Le SDK intercepte le panic et sérialise la pile de la goroutine dans le tableau 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)
}
Corps de la réponse (certaines trames de pile sont omises) :
{
"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" }
]
}
Éviter os.Exit et log.Fatal
N'utilisez pas os.Exit(1) ni les fonctions qui l'encapsulent, comme log.Fatal. Si le processus se termine ainsi, l'environnement d'exécution ne peut renvoyer ni message d'erreur ni trace de pile. Seul un message générique de fin de processus est retourné, ce qui complique le débogage.
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)
}
Corps de la réponse :
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 0ms, maxMemoryUsage: 8MB)"
}
Les champs errorType et stackTrace sont absents.