Python异常处理

OSS Python SDK异常(OssError)分为三类:ClientError、RequestErrorServerError,这些异常定义在oss2.exceptions子模块中。

异常的变量、类型及描述如下表所示:

变量

类型0

描述

status

int

  • 如果为ServerError异常,则statusHTTP状态码。

  • 如果为ClientErrorRequestError异常,则status为固定值。

request_id

str

  • 如果为ServerError异常,则OSS服务器返回请求ID。

  • 如果为ClientErrorRequestError异常,则request_id返回的是空字符串。

codemessage

str

对应OSS的错误响应格式里的CodeMessage两个XML Tag中的文本。

异常处理示例

以下代码展示了下载一个不存在文件时的异常处理,并打印出错误信息的HTTP状态码和请求ID。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

try:
    # 填写下载的文件名称,例如exampleobject.txt。
    stream = bucket.get_object('exampleobject.txt')
except oss2.exceptions.NoSuchKey as e:
    print('status={0}, request_id={1}'.format(e.status, e.request_id))            

ClientError

ClientError是由于客户端输入有误引起的。例如,使用bucket.batch_delete_objects方法时,如果收到空的文件列表,会抛出该异常。ClientErrorstatus值是oss2.exceptions.OSS_CLIENT_ERROR_STATUS。

RequestError

HTTP库抛出异常时,Python SDK会将其转换为RequestError。RequestErrorstatus值是oss2.exceptions.OSS_REQUEST_ERROR_STATUS。

ServerError

OSS服务器返回HTTP错误码时,Python SDK会将其转换为ServerError。ServerError根据HTTP状态码和OSS错误码派生出多个子类。其中NotFound子类对应所有404异常,Conflict子类对应所有409异常。

下表列出了常见的错误码:

异常类

HTTP状态码

OSS错误码

描述

NotModified

304

使用条件下载时,通过If-Modified-Since参数指定的时间晚于Object实际修改时间。

InvalidArgument

400

InvalidArgument

分片上传时如果指定了x-oss-complete-all:yes,则不允许继续指定body,否则报错。

AccessDenied

403

AccessDenied

没有相应的访问权限。

NoSuchBucket

404

NoSuchBucket

Bucket不存在。

NoSuchKey

404

NoSuchKey

文件不存在。

NoSuchUpload

404

NoSuchUpload

分片上传或者断点续传时,部分分片上传成功,但最终未完成上传。

NoSuchWebsite

404

NoSuchWebsiteConfiguration

Bucket未配置静态网站托管。

NoSuchLifecycle

404

NoSuchLifecycle

Bucket未配置生命周期规则。

NoSuchCors

404

NoSuchCORSConfiguration

Bucket未配置跨域资源共享。

BucketNotEmpty

409

BucketNotEmpty

要删除的Bucket中存在未删除的Object、未完成的分片上传任务或Livechannel。

PositionNotEqualToLength

409

PositionNotEqualToLength

Position的值和当前Object的长度不一致。

ObjectNotAppendable

409

ObjectNotAppendable

当前文件不是Appendable类型。