Go中调用出错,会统一返回接口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状态码
}
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 | 发起请求的时间和服务器时间超出15分钟 | 403 |
RequestTimeout | 请求超时 | 400 |
RequestIsNotMultiPartContent | Post请求content-type非法 | 400 |
SignatureDoesNotMatch | 签名错误 | 403 |
TooManyBuckets | 用户的Bucket数目超过限制 | 400 |
InvalidEncryptionAlgorithmError | 指定的熵编码加密算法错误 | 400 |
提示:
- 上表的错误码即OssServiceError.Code,HTTP状态码即OssServiceError.StatusCode。
- 如果试图以OSS不支持的操作来访问某个资源,返回405 Method Not Allowed错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Go语言中,错误处理是一个核心机制,所有可能出错的操作通常会返回一个实现了error
接口的对象。该接口非常简单,仅包含一个Error() string
方法用于获取错误的描述信息。对于更具体的错误类型,比如网络相关的错误,可能会额外实现如Timeout()
和Temporary()
这样的方法来指示错误的特性。
使用阿里云的OSS Go SDK进行操作时,错误处理同样遵循这一模式。当请求失败时,SDK会根据错误来源返回不同的错误类型:
客户端错误:包括HTTP请求错误、IO错误等,这些都直接实现了基本的error
接口。
服务器端错误(ServiceError):当OSS服务端处理请求出错时,会返回一个ServiceError
结构体,它不仅实现了error
接口,还包含了更多详细信息,如错误码(Code)、错误消息(Message)、请求ID(RequestId)、HostId以及HTTP状态码(StatusCode)。
HTTP状态码不符错误(UnexpectedStatusCodeError):如果OSS返回的HTTP状态码与预期不一致,SDK会抛出一个UnexpectedStatusCodeError
,其中记录了预期的状态码和实际收到的状态码。
OSS定义了一系列错误码,每个错误码对应特定的HTTP状态码和错误场景,例如: - AccessDenied
(403) 表示访问被拒绝。 - BucketAlreadyExists
(409) 指Bucket已存在。 - NoSuchBucket
(404) 表示请求的Bucket不存在。
这些错误码通过ServiceError.Code
字段提供,帮助开发者准确识别并处理问题。
在处理OSS Go SDK的错误时,可以采取以下策略: 1. 检查错误类型:利用类型断言或类型switch来区分不同类型的错误,针对特定错误(如ServiceError
)提取详细错误信息进行处理。 2. 重试逻辑:对于临时性错误(如超时或服务端暂时不可用),实施合理的重试策略。 3. 日志记录:记录详细的错误信息,包括错误码、消息及请求ID,便于问题追踪和分析。 4. 权限验证:确保应用具有执行所需操作的适当权限。 5. 配置验证:仔细检查Endpoint、Bucket名称、AccessKey ID和Secret等配置是否正确无误。
通过上述方法,您可以有效地诊断和解决在使用OSS Go SDK过程中遇到的错误情况。