烧瓶错误处理

问题描述

| 我正在尝试捕获flask-sqlalchemy生成错误。不幸的是,我的代码无法处理该错误,因为调试器首先捕获了该错误。当我尝试将记录插入一个具有唯一性但被重复的字段的数据库时,是否会发生这种情况?这是回溯。
sqlalchemy.exc.IntegrityError

IntegrityError: (IntegrityError) column username is not unique u\'INSERT INTO user (username,password,karma) VALUES (?,?,?)\' (u\'Test\',u\'test\',0)
Traceback (most recent call last)

    *
      File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",line 889,in __call__

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return self.wsgi_app(environ,start_response)

    *
      File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",line 879,in wsgi_app

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] response = self.make_response(self.handle_exception(e))

    *
      File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",line 876,in wsgi_app

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] rv = self.dispatch_request()

    *
      File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",line 695,in dispatch_request

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return self.view_functions[rule.endpoint](**req.view_args)

    *
      File \"/home/josh/Projects/masterpieces_of_code/app.py\",line 70,in create_user

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] db.session.commit()

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/scoping.py\",line 129,in do

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return getattr(self.registry(),name)(*args,**kwargs)

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",line 653,in commit

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] self.transaction.commit()

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",line 364,in commit

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] self._prepare_impl()

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",line 348,in _prepare_impl

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] self.session.flush()

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",line 1346,in flush

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] self._flush(objects)

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",line 1427,in _flush

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] flush_context.execute()

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/unitofwork.py\",line 299,in execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] rec.execute(self)

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/unitofwork.py\",line 443,in execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] uow

    *
      File \"/usr/share/pyshared/sqlalchemy/orm/mapper.py\",line 1833,in _save_obj

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] execute(statement,params)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1794,in execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] object,*multiparams,**params)

    *
      File \"/usr/share/pyshared/sqlalchemy/interfaces.py\",line 149,in execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return execute(clauseelement,**params)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1157,in execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] params)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1237,in _execute_clauseelement

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return self.__execute_context(context)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1268,in __execute_context

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] context.parameters[0],context=context)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1806,in _cursor_execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] cursor,statement,parameters,context,False)

    *
      File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flaskext/sqlalchemy.py\",line 115,in cursor_execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] return execute(cursor,context)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1367,in _cursor_execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] context)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",line 1360,in _cursor_execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] context)

    *
      File \"/usr/share/pyshared/sqlalchemy/engine/default.py\",line 288,in do_execute

       [display the sourcecode for this frame]  [Open an interactive python shell in this frame] cursor.execute(statement,parameters)

    IntegrityError: (IntegrityError) column username is not unique u\'INSERT INTO user (username,0)

This is the copy/Paste friendly version of the traceback. You can also paste this traceback into the public lodgeit pastebin:

Traceback (most recent call last):
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",in __call__
    return self.wsgi_app(environ,start_response)
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",in wsgi_app
    rv = self.dispatch_request()
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File \"/home/josh/Projects/masterpieces_of_code/app.py\",in create_user
    db.session.commit()
  File \"/usr/share/pyshared/sqlalchemy/orm/scoping.py\",in do
    return getattr(self.registry(),**kwargs)
  File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",in commit
    self.transaction.commit()
  File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",in commit
    self._prepare_impl()
  File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",in _prepare_impl
    self.session.flush()
  File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",in flush
    self._flush(objects)
  File \"/usr/share/pyshared/sqlalchemy/orm/session.py\",in _flush
    flush_context.execute()
  File \"/usr/share/pyshared/sqlalchemy/orm/unitofwork.py\",in execute
    rec.execute(self)
  File \"/usr/share/pyshared/sqlalchemy/orm/unitofwork.py\",in execute
    uow
  File \"/usr/share/pyshared/sqlalchemy/orm/mapper.py\",in _save_obj
    execute(statement,params)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in execute
    object,**params)
  File \"/usr/share/pyshared/sqlalchemy/interfaces.py\",in execute
    return execute(clauseelement,**params)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in execute
    params)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in _execute_clauseelement
    return self.__execute_context(context)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in __execute_context
    context.parameters[0],context=context)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in _cursor_execute
    cursor,False)
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flaskext/sqlalchemy.py\",in cursor_execute
    return execute(cursor,context)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in _cursor_execute
    context)
  File \"/usr/share/pyshared/sqlalchemy/engine/base.py\",in _cursor_execute
    context)
  File \"/usr/share/pyshared/sqlalchemy/engine/default.py\",in do_execute
    cursor.execute(statement,parameters)
IntegrityError: (IntegrityError) column username is not unique u\'INSERT INTO user (username,0)

The debugger caught an exception in your Wsgi application. You can Now look at the traceback which led to the error.

To switch between the interactive traceback and the plaintext one,you can click on the \"Traceback\" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.

You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:

    * dump() shows all variables in the frame
    * dump(obj) dumps all that\'s kNown about the object

brought to you by DON\'T PANIC,your friendly Werkzeug powered traceback interpreter.
我忘了提及烧瓶在尝试处理错误时的反应。我得到一些与未定义的全局相关的信息。这是对此的追溯。
Traceback (most recent call last):
  File \"/home/josh/Projects/masterpieces_of_code/env/lib/python2.6/site-packages/flask/app.py\",line 72,in create_user
    except(IntegrityError):
NameError: global name \'IntegrityError\' is not defined
    

解决方法

        您需要在执行
db.session.commit()
的代码块中的
create_user
函数(masterpieces_of_code / app.py)中放入try / catch并在那里处理异常。 更新:如果您以ѭ5getting得到
NameError
,则意味着您可能会错过
from sqlalchemy.exc import IntegrityError
在你的
app.py
中。那不是来自Flask的消息,而是Python告诉您一个未知名称(由于缺少导入),因为它解释了
app.py
中的代码。