我有一個使用 向 AWS 發出請求的函式,boto3
我希望捕獲任何例外并引發兩個自定義錯誤之一,具體取決于botocore.exceptions
回傳的例外。我以為我有這個作業,但一個except
塊正在捕獲該塊未列出的錯誤。
首先,我想AwsUnauthorizedException
為任何 SSO 錯誤回傳自定義。這相當簡單,作業原理如下。
aws_unauthorized_exceptions = (botocore.exceptions.SSOError, botocore.exceptions.SSOTokenLoadError, botocore.exceptions.UnauthorizedSSOTokenError)
...
except aws_unauthorized_exceptions as e:
err_msg = str(e)
details = {'aws_error_message': err_msg, **req_msg}
raise AwsUnauthorizedException(**details) from None
AwsBadRequestException
但是接下來我希望為任何其他botocore.exceptions
例外回傳自定義。問題是, usingException
意味著捕獲所有其他例外,而不僅僅是其他botocore.exceptions
例外,這不是我現在想要在我的代碼中執行的操作。
所以我正在使用該inspect
模塊并創建一個包含所有例外的元組botocore.exceptions
,除了aws_unauthorized_exceptions
.
for name, obj in inspect.getmembers(botocore.exceptions):
if inspect.isclass(obj) and obj not in aws_unauthorized_exceptions:
aws_bad_request_exceptions = aws_bad_request_exceptions (obj,)
...
except aws_bad_request_exceptions as e:
err_msg = e.response['Error']['Message']
details = {'aws_error_message': err_msg}
raise AwsBadRequestException(**details)
但是,當我首先包含兩個except
塊時aws_bad_request_exceptions
,它仍然會從aws_unauthorized_exceptions
.
為了確保有問題的例外(botocore.exceptions.SSOTokenLoadError
在本例中)不在元組中,我在塊中aws_bad_request_exceptions
添加了以下行。except
printed(type(e) in aws_bad_request_exceptions)
這印False
。
誰能建議我為什么會看到這種意外行為?
uj5u.com熱心網友回復:
botocore 中的所有例外都有幾個常見的超類:botocore.exceptions.BotoCoreError
和botocore.exceptions.ClientError
.
您的aws_bad_request_exceptions
元組最終將包含這些超類,并且由于 except 子句按順序匹配,因此所有 BotoCore 例外都會匹配。
令人高興的是,正是由于 botocore 的錯誤具有這些超類,您根本不需要構造該元組;只需在第一個 except 塊中捕獲 auth 錯誤,然后在另一個塊中捕獲所有其他 boto 錯誤(并且不會捕獲其他例外)。
import botocore.exceptions
try:
...
except (
botocore.exceptions.SSOError,
botocore.exceptions.SSOTokenLoadError,
botocore.exceptions.UnauthorizedSSOTokenError,
) as auth_err:
err_msg = str(auth_err)
details = {'aws_error_message': err_msg, **req_msg}
raise AwsUnauthorizedException(**details) from None
except (
botocore.exceptions.BotoCoreError,
botocore.exceptions.ClientError,
) as boto_err:
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/507086.html