Python Tornado用户输入错误捕获

Python Tornado用户输入错误捕获,python,exception-handling,tornado,Python,Exception Handling,Tornado,我正在开发一个龙卷风应用程序。它在一个名为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

我正在开发一个龙卷风应用程序。它在一个名为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”中,显示到网页上。你能指出我在试图抓住这种错误时可能犯了什么错误吗?谢谢。

啊。很抱歉,为了尽量简化这个问题的代码,我省略了最重要的一行。
create_user
函数有一个“transaction_op”装饰器,它处理诸如在出现错误时回滚事务之类的事情。然而,这个装饰者因此捕捉到了异常,并没有重新引发它。因此,我无法在处理程序中捕获它,因为当它离开
create\u user
函数时,异常已经被捕获


这个故事的寓意是:如果一个函数和调用它的代码之间发生了无法解释的事情,请怀疑该函数的修饰符。

python版本是2.7.3。它看起来不像api.UserEditException,因为err会给出任何不同的结果。