Python自定义异常及子异常
有什么好的方法来抛出子异常(如果这个词是对的)? 场景: 我想在发生http或ftp异常时抛出一个自定义的连接异常(ConnectivityException)。有没有办法抛出连接异常,让这些异常能够被正确分类(也就是说,我应该能分辨出连接异常是因为http还是ftp引起的)?
2 个回答
1
你可以给ConnectivityException这个错误加一个叫做'source'的属性,根据具体情况把它设置为'http'或者'ftp'。当你捕捉到这个错误时,可以检查'source'属性,然后决定接下来要怎么处理。
在这里,我推荐另一种方法,就是使用继承类。
class ConnectivityException(Exception):
pass # you can define some attributes and methods, here I just escape
class HTTPConnectivityException(ConnectivityException):
pass
class FTPConnectivityException(ConnectivityException):
pass
def func():
if some_condition:
raise HTTPConnectivityException()
if some_other_condition:
raise FTPConnectivityException()
def another_func():
try:
func()
except HTTPConnectivityException as e:
pass # you can do something here
except FTPConnectivityException as e:
pass
3
一种常见的方法是创建一个新的异常类,专门处理不同类型的连接错误,这样你可以通过继承ConnectivityException
来实现:
class ConnectivityException(Exception): pass
class HTTPConnectivityException(ConnectivityException): pass
class FTPConnectivityException(ConnectivityException): pass
这样一来,当你遇到特定的错误时,就可以用raise HTTPConnectivityException
或者raise FTPConnectivityException
来抛出相应的错误,而不是总是用raise ConnectivityException
。
你可以使用多个异常处理块,根据不同的异常类型来处理错误:
try:
some_network_operation()
except HTTPConnectivityException as ex:
# This will execute if the error is an HTTPConnectivityException.
except FTPConnectivityException as ex:
# Likewise for FTPConnectivityException.
except ConnectivityException as ex:
# The generic case; this block will execute if the ConnectivityException isn't
# an instance of one of the earlier specified subclasses.
需要注意的是,异常处理块是按照顺序尝试的;第一个匹配到的异常类会被使用。所以在这种情况下,你需要把ConnectivityException
的处理块放在最后,否则它会捕捉到HTTPConnectivityException
和FTPConnectivityException
的错误。