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