处理JS中的Python异常

时间:2014-11-24 10:29:44

标签: javascript python node.js exception-handling

我从Node.js来到python,我已经习惯了这样的错误处理:

doSmth(function(err, data) {
    if (err) {
        log(err);
    } else {
        fooSmth(data, function(err, res) {
            if (err) ...
        })
    }
})

在Python中可以接受像

这样的错误
def do_smth(arg):
    try:
        data = int(arg)
        return None, data
    except Exception as e:
        logger(e)
        return e, None


err, data = do_smth("1715")
if not err:
    print data

这样函数总是返回一个包含异常和数据值的元组:

(无,数据)或(例外,无)

2 个答案:

答案 0 :(得分:7)

Pythonic的方法是将try移到do_smth之外:

def do_smth(arg):
    return int(arg)

try:
    data = do_smth("1715")
except ValueError: # test for a specific error wherever possible
    logger.exception()
else:
    print data
在失败案例中

return None

def do_smth(arg):
    try:
        return int(arg)
    except ValueError:
        logger.exception()

data = do_smth("1715")
if data is not None: # test singletons with is
    print data

请注意,Python通常偏好"easier to ask for forgiveness than permission" - 样式编码。

答案 1 :(得分:2)

虽然代码中没有错误,但通常不会将异常作为参数传递到其他作用域,除非异常实例实际用作数据。 Python 中的例外是轻量级的,它们会冒泡以呈现完整的回溯,所以你必须让它们生存并发生。

如果您在调用do_smth时遇到某种异常,只需编写代码来处理它,如下所示:

# Definition
def do_smth(arg):
    return int(arg)


# Usage elsewhere
try:
    data = do_smth(['invalid', 'number'])
except TypeError:
    print('Incompatible type!')
except ValueError:
    print('Not a number.')
else:
    print('Conversion successful.')

专业提示:避免仅仅抓住Exception。总是期望特定类型的错误,习惯于编写和提出自己的异常。它有很大帮助。 Read more关于它。 ;)

PS:我也来自JavaScript作为主要语言;我相信你也会喜欢Python。 :)