全部產品
Search
文件中心

Object Storage Service:Go錯誤處理

更新時間:Feb 28, 2024

本文介紹Go SDK的錯誤處理。

用戶端錯誤

Go SDK中調用出錯會統一返回error介面,該介面定義如下:

type error interface {
    Error() string
}

其它錯誤繼承該介面。比如HTTP錯誤請求返回的錯誤如下:

//net.Error 
type Error interface {
    error
    Timeout() bool   // Is the error a timeout
    Temporary() bool // Is the error temporary
}

伺服器端錯誤

使用OSS Go SDK時如果請求出錯,會返回相應的error。HTTP請求、IO等錯誤會返回Go語言自訂錯誤。OSS Server處理請求出錯,則返回如下的錯誤,該錯誤實現了Error介面。

type ServiceError struct {
    Code       string    // OSS返回給使用者的錯誤碼
    Message    string    // OSS給出的詳細錯誤資訊
    RequestId  string    // 用於唯一標識該次請求的UUID
    HostId     string    // 用於標識訪問的OSS叢集
    StatusCode int       // HTTP狀態代碼
}

如果OSS返回的HTTP狀態代碼與預期不符,則返回如下錯誤,該錯誤也實現了Error介面。

type UnexpectedStatusCodeError struct {
    allowed []int    // 預期OSS返回HTTP狀態代碼
    got     int      // OSS實際返回HTTP狀態代碼
}

錯誤處理樣本

以下代碼用於展示錯誤處理:

package main
import (
    "fmt"
    "os"
    "strings"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// 錯誤處理函數。
func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}
func main() {
    /// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 建立OSSClient執行個體。
    // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        HandleError(err)
    }
    // 填寫儲存空間名稱,例如examplebucket。
    bucketName := "examplebucket"
    // 填寫Object名稱,例如exampleobject.txt。
    objectName := "exampleobject.txt"
    
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        HandleError(err)
    }
    // 上傳字串。
    err = bucket.PutObject(objectName, strings.NewReader("Hello OSS"))
    if err != nil {
        HandleError(err)
   }
}

OSS錯誤碼

OSS錯誤碼列表如下:

錯誤碼

描述

HTTP狀態代碼

AccessDenied

拒絕訪問

403

BucketAlreadyExists

Bucket已經存在

409

BucketNotEmpty

Bucket不為空白

409

EntityTooLarge

實體過大

400

EntityTooSmall

實體過小

400

FileGroupTooLarge

檔案組過大

400

InvalidLinkName

Object Link與指向的Object同名

400

LinkPartNotExist

Object Link中指向的Object不存在

400

ObjectLinkTooLarge

Object Link中Object個數過多

400

FieldItemTooLong

Post請求中表單域過大

400

FilePartInterity

檔案Part已改變

400

FilePartNotExist

檔案Part不存在

400

FilePartStale

檔案Part過時

400

IncorrectNumberOfFilesInPOSTRequest

Post請求中檔案個數非法

400

InvalidArgument

參數格式錯誤

400

InvalidAccessKeyId

AccessKeyId不存在

403

InvalidBucketName

無效的Bucket名稱

400

InvalidDigest

無效的摘要

400

InvalidEncryptionAlgorithmError

指定的熵編碼密碼編譯演算法錯誤

400

InvalidObjectName

無效的Object名稱

400

InvalidPart

無效的Part

400

InvalidPartOrder

無效的Part順序

400

InvalidPolicyDocument

無效的Policy文檔

400

InvalidTargetBucketForLogging

Logging操作中有無效的目標Bucket

400

InternalError

OSS內部錯誤

500

MalformedXML

XML格式非法

400

MalformedPOSTRequest

Post請求的body格式非法

400

MaxPOSTPreDataLengthExceededError

Post請求上傳檔案內容之外的body過大

400

MethodNotAllowed

不支援的方法

405

MissingArgument

缺少參數

411

MissingContentLength

缺少內容長度

411

NoSuchBucket

Bucket不存在

404

NoSuchKey

檔案不存在

404

NoSuchUpload

Multipart Upload ID不存在

404

NotImplemented

無法處理的方法

501

PreconditionFailed

預先處理錯誤

412

RequestTimeTooSkewed

用戶端本地時間和OSS伺服器時間相差超過15分鐘

403

RequestTimeout

請求逾時

400

RequestIsNotMultiPartContent

Post請求Content-Type非法

400

SignatureDoesNotMatch

簽名錯誤

403

TooManyBuckets

使用者的Bucket數目超過限制

400

InvalidEncryptionAlgorithmError

指定的熵編碼密碼編譯演算法錯誤

400

說明

上表中的錯誤碼即OssServiceError.Code,HTTP狀態代碼即OssServiceError.StatusCode。