Python自定义异常和子异常
提出子异常的好方法是什么(这就是术语)? 脚本:Python自定义异常和子异常,python,python-2.7,custom-exceptions,Python,Python 2.7,Custom Exceptions,提出子异常的好方法是什么(这就是术语)? 脚本: 我想在发生http或ftp异常时引发自定义ConnectionyException。是否有任何方法可以引发ConnectivityException,以便对异常进行正确分类(即,我应该能够判断是否由于http ot ftp引发了ConnectivityException)?标准技术是将ConnectivityException子类化,以创建特定于每种错误条件的异常类: class ConnectivityException(Exception):
我想在发生http或ftp异常时引发自定义ConnectionyException。是否有任何方法可以引发ConnectivityException,以便对异常进行正确分类(即,我应该能够判断是否由于http ot ftp引发了ConnectivityException)?标准技术是将
ConnectivityException
子类化,以创建特定于每种错误条件的异常类:
class ConnectivityException(Exception): pass
class HTTPConnectivityException(ConnectivityException): pass
class FTPConnectivityException(ConnectivityException): pass
然后,您可以使用raise-HTTPConnectivityException
或raise-ftp-ConnectivityException
,而不是raise-HTTPConnectivityException
,具体取决于要指示的错误类型
根据异常类型,可以使用多个异常块来分派错误处理:
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
。一种标准技术是将ConnectivityException
子类化,以创建特定于每种错误条件的异常类:
class ConnectivityException(Exception): pass
class HTTPConnectivityException(ConnectivityException): pass
class FTPConnectivityException(ConnectivityException): pass
然后,您可以使用raise-HTTPConnectivityException
或raise-ftp-ConnectivityException
,而不是raise-HTTPConnectivityException
,具体取决于要指示的错误类型
根据异常类型,可以使用多个异常块来分派错误处理:
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
。您可以向ConnectivityException添加一个名为“source”的属性,并根据具体情况将其设置为“http”或“ftp”,捕获ConnectionException时,请检查源属性并决定要执行的操作
这里我推荐另一种使用继承类的方法
类连接异常(异常):
pass#您可以定义一些属性和方法,这里我只是转义一下
HTTPConnectivityException类(ConnectivityException):
通过
FTP类连接异常(连接异常):
通过
def func():
如果出现以下情况:
引发HttpConnectionException()
如果出现某些或其他情况:
引发FTPC连接异常()
定义另一个函数():
尝试:
func()
除HTTPConnectivityException为e外:
通过这里,你可以做点什么
除FTP连接外,e除外:
通过
您可以将名为“source”的属性添加到ConnectionVityException中,并根据具体情况将其设置为“http”或“ftp”,捕获ConnectionVityException时,请检查source属性并决定执行什么操作
这里我推荐另一种使用继承类的方法
类连接异常(异常):
pass#您可以定义一些属性和方法,这里我只是转义一下
HTTPConnectivityException类(ConnectivityException):
通过
FTP类连接异常(连接异常):
通过
def func():
如果出现以下情况:
引发HttpConnectionException()
如果出现某些或其他情况:
引发FTPC连接异常()
定义另一个函数():
尝试:
func()
除HTTPConnectivityException为e外:
通过这里,你可以做点什么
除FTP连接外,e除外:
通过
或者进一步将自定义异常子类化为FTPConnectivityException
等,或者将适当的信息放入异常的args
中。正确的“OO”方式是roipii的第一个建议。然后,您将根据异常类型进行捕获。或者进一步将自定义异常子类化为FTPConnectivityException
,等等,或者将适当的信息放入异常的args
。正确的“OO”方式是roipii的第一个建议。然后根据异常的类型进行捕获。