本文介绍Go SDK的错误处理。

客户端错误

Go SDK中调用出错会统一返回error接口,该接口定义如下:

  1. type error interface {
  2. Error() string
  3. }

其它错误继承该接口。比如HTTP错误请求返回的错误如下:

  1. //net.Error
  2. type Error interface {
  3. error
  4. Timeout() bool // Is the error a timeout
  5. Temporary() bool // Is the error temporary
  6. }

服务器端错误

使用OSS Go SDK时如果请求出错,会返回相应的error。HTTP请求、IO等错误会返回Go语言自定义错误。OSS Server处理请求出错,则返回如下的错误,该错误实现了Error接口。

  1. type ServiceError struct {
  2. Code string // OSS返回给用户的错误码
  3. Message string // OSS给出的详细错误信息
  4. RequestId string // 用于唯一标识该次请求的UUID
  5. HostId string // 用于标识访问的OSS集群
  6. StatusCode int // HTTP状态码
  7. }

如果OSS返回的HTTP状态码与预期不符,则返回如下错误,该错误也实现了Error接口。

  1. type UnexpectedStatusCodeError struct {
  2. allowed []int // 预期OSS返回HTTP状态码
  3. got int // OSS实际返回HTTP状态码
  4. }

错误处理示例

以下代码用于展示错误处理:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. // 错误处理函数。
  9. func HandleError(err error) {
  10. fmt.Println("Error:", err)
  11. os.Exit(-1)
  12. }
  13. func main() {
  14. // 创建OSSClient实例。
  15. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  16. if err != nil {
  17. HandleError(err)
  18. }
  19. bucketName := "<yourBucketName>"
  20. objectName := "<yourObjectName>"
  21. // 获取存储空间。
  22. bucket, err := client.Bucket(bucketName)
  23. if err != nil {
  24. HandleError(err)
  25. }
  26. // 简单上传:字符串上传。
  27. err = bucket.PutObject(objectName, strings.NewReader("yourObjectValueContentString"))
  28. if err != nil {
  29. HandleError(err)
  30. }

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。