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

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

变量 类型0 描述
status int
  • 如果为ServerError异常,则status为HTTP状态码。
  • 如果为ClientError和RequestError异常,则status为固定值。
request_id str
  • 如果为ServerError异常,则OSS服务器返回请求ID。
  • 如果为ClientError和RequestError异常,则request_id返回的是空字符串。
code和message str 对应OSS的错误响应格式里的Code和Message两个XML Tag中的文本。

异常处理示例

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

# -*- coding: utf-8 -*-
import oss2

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')

try:
    stream = bucket.get_object('random-key.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方法时,如果收到空的文件列表,会抛出该异常。ClientError的status值是oss2.exceptions.OSS_CLIENT_ERROR_STATUS。

RequestError

当HTTP库抛出异常时,Python SDK会将其转换为RequestError。RequestError的status值是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类型。