本文介绍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。