Function Compute, Go çalışma zamanı hatalarını yanıt gövdesi ve HTTP üst bilgileri aracılığıyla iletir. Hataları algılamak için X-Fc-Error-Type yanıt üst bilgisini kontrol edin; örneğin: X-Fc-Error-Type: UnhandledInvocationError. Tüm hata türlerinin listesi için Temeller konusundaki Hata yönetimi bölümüne bakın.
Go çalışma zamanı, bir işleyici işlevinden hata bilgisi döndürmek için üç yöntem sunar.
Hata yanıtı biçimi
Her yöntem farklı bir yanıt gövdesi yapısı oluşturur:
| Yöntem | **errorMessage** |
**errorType** |
**stackTrace** |
|---|---|---|---|
İşleyiciden error döndürme |
Hata dizesi | Go hata türü (ör. errorString) |
Dahil edilmez |
panic çağırma |
Panic değeri | Panic değerinin Go türü (ör. string) |
Dahil edilir |
os.Exit / log.Fatal çağırma |
Genel süreç çıkış mesajı | Dahil edilmez | Dahil edilmez |
İşleyiciden hata döndürme
İşleyici işlevinden doğrudan bir error değeri döndürün. SDK hatayı yakalar ve yanıt gövdesine serileştirir.
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)
}
Yanıt gövdesi:
{
"errorMessage": "something is wrong!",
"errorType": "errorString"
}
panic kullanımı
Yanıtın bir yığın izlemesi içermesini istediğinizde panic çağırın. SDK panic'i yakalar ve goroutine yığınını stackTrace dizisine serileştirir.
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)
}
Yanıt gövdesi (bazı yığın çerçeveleri atlanmıştır):
{
"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 ve log.Fatal kullanımından kaçının
os.Exit(1) veya bunu saran log.Fatal gibi işlevleri kullanmayın. Süreç bu şekilde sonlandığında çalışma zamanı hata mesajı veya yığın izlemesi döndüremez; yalnızca genel bir süreç çıkış mesajı döndürülür ve bu durum hata ayıklamayı zorlaştırır.
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)
}
Yanıt gövdesi:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 0ms, maxMemoryUsage: 8MB)"
}
errorType veya stackTrace alanları dahil edilmez.