本文介紹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請按實際情況填寫。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
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。