Python 链式异常捕获如何向下继续传递

比如下面这个代码,我不静静要捕获 ABCERROR,and 要是 '啦啦啦',如果不是,让下层的 except Exception as error: 处理,而不是向外抛出,如何实现?

python">from loguru import logger

class 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 logger

class 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 链式异常捕获如何向下继续传递

以上是 Python 链式异常捕获如何向下继续传递 的全部内容, 来源链接: utcz.com/p/938356.html

回到顶部