0

私はトルネードアプリに取り組んでいます。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」に入れられたエラーメッセージをWebページに表示したいと思います。この種のエラーをキャッチしようとして私が間違っている可能性があることを指摘できますか?ありがとう。

4

1 に答える 1

0

うーん。申し訳ありませんが、この質問のコードをできるだけ単純化するために、最も重要な行を省略したようです。このcreate_user関数には「transaction_op」デコレータがあり、エラーが発生した場合にトランザクションをロールバックするなどの処理を行いました。ただし、このデコレータは例外をキャッチしており、再起動していませんでした。したがって、ハンドラーでキャッチできませんでしたcreate_user。関数を終了するまでに、例外が既にキャッチされていたためです。

話の教訓:ある関数とそれを呼び出すコードの間で不可解なことが起こっている場合は、関数のデコレータを疑ってください。

于 2013-03-25T19:23:34.960 に答える