开发者社区 问答 正文

Go-SDK之如何实现错误?

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
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发起请求的时间和服务器时间超出15分钟403
RequestTimeout请求超时400
RequestIsNotMultiPartContentPost请求content-type非法400
SignatureDoesNotMatch签名错误403
TooManyBuckets用户的Bucket数目超过限制400
InvalidEncryptionAlgorithmError指定的熵编码加密算法错误400

提示:
  • 上表的错误码即OssServiceError.Code,HTTP状态码即OssServiceError.StatusCode。
  • 如果试图以OSS不支持的操作来访问某个资源,返回405 Method Not Allowed错误。

展开
收起
青衫无名 2017-10-19 14:45:00 2595 分享 版权
阿里云 AI 助理回答

在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错误码示例

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过程中遇到的错误情况。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答