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的第一个建议。然后根据异常的类型进行捕获。