本文介绍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实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    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
BucketAlreadyExistsBucket已经存在409
BucketNotEmptyBucket不为空409
EntityTooLarge实体过大400
EntityTooSmall实体过小400
FileGroupTooLarge文件组过大400
InvalidLinkNameObject Link与指向的Object同名400
LinkPartNotExistObject Link中指向的Object不存在400
ObjectLinkTooLargeObject Link中Object个数过多400
FieldItemTooLongPost请求中表单域过大400
FilePartInterity文件Part已改变400
FilePartNotExist文件Part不存在400
FilePartStale文件Part过时400
IncorrectNumberOfFilesInPOSTRequestPost请求中文件个数非法400
InvalidArgument参数格式错误400
InvalidAccessKeyIdAccessKeyId不存在403
InvalidBucketName无效的Bucket名称400
InvalidDigest无效的摘要400
InvalidEncryptionAlgorithmError指定的熵编码加密算法错误400
InvalidObjectName无效的Object名称400
InvalidPart无效的Part400
InvalidPartOrder无效的Part顺序400
InvalidPolicyDocument无效的Policy文档400
InvalidTargetBucketForLoggingLogging操作中有无效的目标Bucket400
InternalErrorOSS内部错误500
MalformedXMLXML格式非法400
MalformedPOSTRequestPost请求的body格式非法400
MaxPOSTPreDataLengthExceededErrorPost请求上传文件内容之外的body过大400
MethodNotAllowed不支持的方法405
MissingArgument缺少参数411
MissingContentLength缺少内容长度411
NoSuchBucketBucket不存在404
NoSuchKey文件不存在404
NoSuchUploadMultipart Upload ID不存在404
NotImplemented无法处理的方法501
PreconditionFailed预处理错误412
RequestTimeTooSkewed客户端本地时间和OSS服务器时间相差超过15分钟403
RequestTimeout请求超时400
RequestIsNotMultiPartContentPost请求Content-Type非法400
SignatureDoesNotMatch签名错误403
TooManyBuckets用户的Bucket数目超过限制400
InvalidEncryptionAlgorithmError指定的熵编码加密算法错误400
说明 上表中的错误码即OssServiceError.Code,HTTP状态码即OssServiceError.StatusCode。