在Python中,Exception和Error都是用来描述程序运行时出现的异常情况。它们的主要区别在于,Exception通常用于表示可预见的异常情况,而Error通常用于表示不可预见的异常情况。
具体来说,以下情况通常需要定义Exception:
-
当程序需要处理某种可预见的异常情况时,可以定义一个Exception类来表示这种异常情况。例如,如果程序需要处理某个文件不存在的情况,可以定义一个
FileNotFoundError
类来表示这种异常情况。 -
当程序需要向调用者报告某种异常情况时,可以抛出一个Exception对象来表示这种异常情况。例如,如果程序在处理某个输入时发现了错误,可以抛出一个
ValueError
对象来表示这种异常情况。
以下情况通常需要定义Error:
-
当程序出现了某种不可预见的异常情况时,可以定义一个Error类来表示这种异常情况。例如,如果程序在执行过程中遇到了系统错误,可以定义一个
SystemError
类来表示这种异常情况。 -
当程序出现了某种无法恢复的异常情况时,可以抛出一个Error对象来表示这种异常情况。例如,如果程序在执行过程中遇到了无法处理的内存错误,可以抛出一个
MemoryError
对象来表示这种异常情况。
需要注意的是,Exception和Error都是Python中内置的类和对象,程序员可以根据实际情况继承这些类,或者自定义新的类来表示不同的异常情况。在实际编程中,通常需要根据具体的需求和设计来选择使用Exception还是Error。
附 举例python 中第三方库Redis的异常处理
Redis中异常定义
python">"Core exceptions raised by the Redis client"class RedisError(Exception):passclass ConnectionError(RedisError):passclass TimeoutError(RedisError):passclass AuthenticationError(ConnectionError):passclass AuthorizationError(ConnectionError):passclass BusyLoadingError(ConnectionError):passclass InvalidResponse(RedisError):passclass ResponseError(RedisError):passclass DataError(RedisError):passclass PubSubError(RedisError):passclass WatchError(RedisError):passclass NoScriptError(ResponseError):passclass ExecAbortError(ResponseError):passclass ReadOnlyError(ResponseError):passclass NoPermissionError(ResponseError):passclass ModuleError(ResponseError):passclass LockError(RedisError, ValueError):"Errors acquiring or releasing a lock"# NOTE: For backwards compatibility, this class derives from ValueError.# This was originally chosen to behave like threading.Lock.passclass LockNotOwnedError(LockError):"Error trying to extend or release a lock that is (no longer) owned"passclass ChildDeadlockedError(Exception):"Error indicating that a child process is deadlocked after a fork()"passclass AuthenticationWrongNumberOfArgsError(ResponseError):"""An error to indicate that the wrong number of argswere sent to the AUTH command"""pass
异常创建和抛出
python"> def connect_to(self, address):self.host, self.port = addresssuper().connect()if self.connection_pool.check_connection:self.send_command("PING")if str_if_bytes(self.read_response()) != "PONG":raise ConnectionError("PING failed")
异常捕获和处理
python"> def _connect_retry(self):if self._sock:return # already connectedif self.connection_pool.is_master:self.connect_to(self.connection_pool.get_master_address())else:for slave in self.connection_pool.rotate_slaves():try:return self.connect_to(slave)except ConnectionError:continueraise SlaveNotFoundError # Never be here