我正在开发一款龙卷风应用。它在一个名为api.py的文件中有CRUD函数,其相关位在这里显示:
class UserEditException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
def create_user(first_name, last_name, email, password, session = None):
others_with_same_email = session.query(MyAppUser).filter(MyAppUser.email.like(email)).all()
if others_with_same_email is not None:
raise UserEditException('Already another account with that email address.')
这是由app.py调用的,其中包含实际的处理程序,包括创建新用户的页面。 app.py的相关内容如下所示:
import api
class CreateUserHandler(BaseHandler):
def get(self):
self.render(
local_templates + "/create_user.html",
user_msg = 'Enter new user attributes, including an email address not already in use.',
)
def post(self):
user_msg = '' #currently there are no problems found with inputs
password = self.get_argument("password")
email = self.get_argument("email")
first_name = self.get_argument("first_name",default=None)
last_name = self.get_argument("last_name",default=None)
if user_msg == '':
try:
new_user = api.create_user(first_name, last_name, email, password, agent_uuid = self.current_user)
except api.UserEditException, err:
user_msg = str(err)
else:
user_msg = 'The new user,'+new_user['first_name']+' '+new_user['last_name']+' ('+new_user['email']+') has been created successfully.'
self.render(
local_templates + "/create_user.html",
first_name = first_name,
last_name = last_name,
email = email,
user_msg = user_msg,
)
当我输入已经在使用的电子邮件时(即故意触发用户创建中的错误),我知道在api.py中它会触发UserEditException,因为消息“已经是另一个具有该电子邮件地址的帐户”。正在写入服务器。然后程序崩溃了。相反,我想要捕获UserEditException,并将放入“user_msg”的错误消息显示在网页上。你能指出我在试图捕捉这种错误时可能做错了什么吗?感谢。
答案 0 :(得分:0)
唉。对不起,我试图尽可能简化这个问题的代码,但是我遗漏了最重要的一行。 create_user
函数有一个“transaction_op”装饰器,它处理了如果出现错误就回滚事务。然而,这个装饰者因此正在捕捉异常,而不是重新提升它。因此,我无法在我的处理程序中捕获它,因为当它离开create_user
函数时,异常已被捕获。
故事的道德:如果在一个函数和调用它的代码之间发生了一些莫名其妙的事情,那就要怀疑函数的装饰器。