Python 链式异常捕获如何向下继续传递
比如下面这个代码,我不静静要捕获 ABCERROR
,and 要是 '啦啦啦',如果不是,让下层的 except Exception as error:
处理,而不是向外抛出,如何实现?
python">from loguru import loggerclass ABCERROR(Exception):
pass
try:
raise ABCERROR('啦啦啦',1234567)
except ABCERROR as error:
print(error.args,type(error.args))
if error.args[0] == '啦啦啦':
logger.debug('我接到了啦啦啦')
else:
raise error
except Exception as error:
logger.error('不是啦啦啦')
一层 try except 可以实现吗?两层 try except 太丑陋了!
可能是我描述的不够清楚,我希望实现的是:
假设一个场景,一个捕捉数据库异常的场景。Mysql 会主动释放长时间没有动作的客户端连接。但是客户端是不知道的,所以,此时客户端在访问数据库就会报错,出现下面这种情况:
首先,先报错 OperationalError
raise err.OperationalError(peewee.OperationalError: (2013, 'Lost connection to MySQL server during query')
如果继续请求就变成了 InterfaceError
错误了
raise err.InterfaceError("(0, '')")peewee.InterfaceError: (0, '')
后面不管请求多少次都是 InterfaceError
所以我要专门处理这种情况,就是 error class type 为 OperationalError
,并且 error args[0] 为 2013
如果两者条件中的任意一个不满足,就让下面的通用异常捕捉来处理
def get_short_uuid(user_id: int, video_id: str) -> str | None: try:
rows = TinyUrl.select(TinyUrl.short_uuid).where(
(TinyUrl.user_id == user_id) &
(TinyUrl.video_id == video_id)
)
if rows:
return rows[0].short_uuid
else:
return None
except peewee.OperationalError as error:
logger.exception(error)
error_code, des = error.args
if error_code == 2013:
logger.error('数据库连接被关闭')
else:
"如果做到不满足 error_code == 2013,让下面的 except Exception as error 来继续处理异常???????????"
except Exception as error:
logger.exception(error)
虽然可以多写一层缩进来实现,但是这样太丑陋了,非常的不优雅,非常的不 pythonic!!!!!!!!!!!!!!!!!!!!!
回答:
from logging import loggerclass ABCError(Exception):
pass
class LalalaError(ABCError):
pass
try:
raise LalalaError('啦啦啦', 1234567)
except LalalaError as error:
logger.debug('我接到了 LalalaError')
except ABCError as error:
logger.debug('我接到了 ABCError')
except Exception as error:
logger.error('不是啦啦啦,也不是 ABCError')
下图这种程序运行线路我暂时没法想到 Python 中有什么写法可以达到你的目的,你已经说了,加一层缩进不是你需要的,那么应该代表,把需要缩进的代码放到一个新的函数也是你不想要的。
以上是 Python 链式异常捕获如何向下继续传递 的全部内容, 来源链接: utcz.com/p/938356.html