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

时间:2018-04-30 15:18:23

标签: python exception-handling

假设我有一个功能,并且根据其输入,它必须"建议"调用程序函数出错了:

def get_task(msg, chat):
    task_id = int(msg)
    query = db.SESSION.query(Task).filter_by(id=task_id, chat=chat)
    try:
        task = query.one()
    except sqlalchemy.orm.exc.NoResultFound:
        return "_404_ error"
    return task

注意在except块我想传递调用函数可以处理的东西并在必要时停止执行,否则它会返回正确的对象。

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

1 个答案:

答案 0 :(得分:3)

您似乎已经知道例外如何运作。

如果出现错误,最好的办法是raise例外。

返回一些 magic 值被认为是一种不好的做法,因为它需要调用者明确地检查它,并且hundred of other reasons

您可以简单地让sqlalchemy.orm.exc.NoResultFound异常转义(删除try:中的except:get_task()块),然后让调用者使用{{try: ... except: ...来处理它1}}阻止,或者,如果你想做一些hiding,你可以定义一个自定义异常:

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' 类更具信息性。

默认构造函数可以提供一个不错的工作:

rho