在python方法中处理异常的合适方法是什么?

在python方法中处理异常的合适方法是什么?,python,exception-handling,Python,Exception Handling,假设我有一个函数,根据它的输入,它必须“通知”调用方函数出了问题: def get_任务(消息,聊天): 任务id=int(msg) query=db.SESSION.query(任务)。筛选依据(id=Task\u id,chat=chat) 尝试: task=query.one() 除sqlalchemy.orm.exc.NoResultFound外: 返回“\u 404\u错误” 返回任务 请注意,在Exception块中,我希望传递调用方函数可以处理的内容,并在必要时停止其执行,否则,

假设我有一个函数,根据它的输入,它必须“通知”调用方函数出了问题:

def get_任务(消息,聊天):
任务id=int(msg)
query=db.SESSION.query(任务)。筛选依据(id=Task\u id,chat=chat)
尝试:
task=query.one()
除sqlalchemy.orm.exc.NoResultFound外:
返回“\u 404\u错误”
返回任务
请注意,在Exception块中,我希望传递调用方函数可以处理的内容,并在必要时停止其执行,否则,它将返回正确的对象

def something_with_the_task(msg, chat):
   task = get_task(msg, chat)
   if task == "_404_ error":
       return
   #do some stuff with task

您似乎已经知道异常是如何工作的

发生错误时最好的方法是
引发一个异常

返回一些神奇的值被认为是一种不好的做法,因为它需要调用方显式地检查它,并且需要一个

您可以简单地让
sqlalchemy.orm.exc.NoResultFound
异常转义(通过删除
try:
except:
中的
get_task()
),并让调用者使用
try:。。。除了:…
块,或者,如果您愿意执行某些操作,可以定义自定义异常:

class YourException(Exception):
    pass
然后像这样使用它:

def get_task(msg, chat):
    try:
        task = ...
    except sqlalchemy.orm.exc.NoResultFound:
        raise YourException('explanation')
    return task

def something_with_the_task(msg, chat):
    try:
        task = get_task(msg, chat)
        # do some stuff with task
    except YourException as e:
        # do something with e
        # e.args[0] will contain 'explanation'
如果需要,可以通过显式添加一些属性和设置这些属性的构造函数,让
YourException
类更具信息性

但是,默认构造函数的工作相当不错:

>>> e = YourException('Program made a boo boo', 42, 'FATAL')
>>> e
YourException('Program made a boo boo', 42, 'FATAL')
>>> e.args[0]
'Program made a boo boo'
>>> e.args[1]
42
>>> e.args[2]
'FATAL'

您应该创建一个异常并在调用者函数中捕获它。为您的接口定义一个更高级别的更合适的异常并
引发它,因为您无法从较低级别的故障中恢复。您也可以使用
除了sqlalchemy.orm.exc.noresultfind as err:raiseyourException('explain')之外的其他方法从err
将原始异常包括在回溯中。