我正在学习如何在python中创建用户定义的异常
/home/composer/.composer-credentials/member.WebAppAdmin
当我运行上面的程序时,我得到名称错误 NameError:name' sqlite13'未定义
如果连接数据库失败,如何调用用户定义的异常?当[除了My ::]之外的MyError被[except:]替换时,仍然不会调用异常块。 谢谢你的帮助。
答案 0 :(得分:3)
定义异常不会改变其他模块引发的异常。如果你希望你的代码使用你的异常,你必须抓住其他模块的rasies,然后重新提升你自己的。
import sqlite3
class MyError(Exception):
def __init__(self, value):
self.value = value
try:
conn= sqlite3.connect('database56.sqlite')
print conn
print 'connection established'
except sqlite3.Error as e:
print 'Error message:', e.value
raise MyError('Could not connect to db: ' + e.value)
我在这里发现了通用的sqlite3错误,但如果它们也被模块引发,则可能需要添加其他异常。究竟是什么异常是不容易在python中弄清楚。您可以在网上阅读来源,试验或浏览示例。
答案 1 :(得分:1)
我认为这是XY Problem。
在这种情况下,您希望捕获NameError,因此您应该在except语句中直接使用它。如果要在捕获错误后执行操作,则应将该操作放在except语句中。可以找到一些文档here。 例如:
except NameError as e:
print 'Error message:', e.value
print 'Splite module not loaded'
用户定义的错误例如对错误/意外的参数或输出有用。因此,用户定义的错误很有用,因为您可以确定引发它们的情况,这不一定是“python会崩溃”的情况。
Here有关它的一些文档。
也许一个例子可以帮助澄清。
假设有一个函数,其中一个变量是某个东西的价格。 然后你可能会这样做:
class NegativePriceException(Exception):
def __init__(self):
print "Price can't be negative!"
raise AttributeError
def calc_price(...):
price = ... #some calculation
if price < 0:
raise NegativePriceException
return price