我从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
这样函数总是返回一个包含异常和数据值的元组:
(无,数据)或(例外,无)
答案 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。 :)