本文介绍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() {
    // 创建OSSClient实例。
    client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
    if err != nil {
        HandleError(err)
    }
    bucketName := "<yourBucketName>"
    objectName := "<yourObjectName>"
    // 获取存储空间。
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        HandleError(err)
    }
    // 简单上传:字符串上传。
    err = bucket.PutObject(objectName, strings.NewReader("yourObjectValueContentString"))
    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。