Go错误处理

本文介绍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 LinkObject个数过多

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。