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