Python自定义异常及子异常

0 投票
2 回答
1522 浏览
提问于 2025-04-17 23:36

有什么好的方法来抛出子异常(如果这个词是对的)? 场景: 我想在发生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的处理块放在最后,否则它会捕捉到HTTPConnectivityExceptionFTPConnectivityException的错误。

撰写回答