Лучший способ обработать исключение в инструкции Except? [Дубликат]

Хорошо для тех, кто достаточно ленив, как я, вот код

from dash import Dash
from werkzeug.wsgi import DispatcherMiddleware
import flask
from werkzeug.serving import run_simple
import dash_html_components as html

server = flask.Flask(__name__)
dash_app1 = Dash(__name__, server = server, url_base_pathname='/dashboard' )
dash_app2 = Dash(__name__, server = server, url_base_pathname='/reports')
dash_app1.layout = html.Div([html.H1('Hi there, I am app1 for dashboards')])
dash_app2.layout = html.Div([html.H1('Hi there, I am app2 for reports')])
@server.route('/')
@server.route('/hello')
def hello():
    return 'hello world!'

@server.route('/dashboard')
def render_dashboard():
    return flask.redirect('/dash1')


@server.route('/reports')
def render_reports():
    return flask.redirect('/dash2')

app = DispatcherMiddleware(server, {
    '/dash1': dash_app1.server,
    '/dash2': dash_app2.server
})

run_simple('0.0.0.0', 8080, app, use_reloader=True, use_debugger=True)
114
задан EMP 31 August 2009 в 01:16
поделиться

9 ответов

125
ответ дан Glenn Maynard 24 August 2018 в 07:24
поделиться
  • 1
    Благодарю. Это сохраняет трассировку, но теряет сообщение об ошибке исходного исключения. Как просмотреть оба сообщения и обе трассировки? – EMP 31 August 2009 в 00:49
  • 2
    raise MyException(str(e)), ... и т. д. – Glenn Maynard 31 August 2009 в 03:52
  • 3
    Python 3 добавляет raise E() from tb и .with_traceback(...) – Dima Tisnek 30 May 2014 в 10:02
  • 4
    @GlennMaynard это довольно старый вопрос, но средний аргумент raise - это значение для перехода к исключению (в случае, если первым аргументом является класс исключения, а не экземпляр). Поэтому, если вы хотите заменить исключения, вместо выполнения raise MyException(str(e)), None, sys.exc_info()[2], лучше использовать это: raise MyException, e.args, sys.exc_info()[2]. – bgusach 20 February 2015 в 09:19
  • 5
    Путь Python2 и 3 возможен с использованием будущего пакета: python-future.org/compatible_idioms.html#raising-exceptions Например. from future.utils import raise_ и raise_(ValueError, None, sys.exc_info()[2]). – jtpereyda 18 February 2016 в 02:42
3
ответ дан Andrew Barber 24 August 2018 в 07:24
поделиться
2
ответ дан brool 24 August 2018 в 07:24
поделиться
17
ответ дан Community 24 August 2018 в 07:24
поделиться
  • 1
    Откуда ex.strerror? Я не могу найти какой-либо существенный удар для этого в документах Python. Разве это не должно быть str(ex)? – Henrik Heimbuerger 5 February 2013 в 10:11
  • 2
    IOError получен из EnvironmentError , @hheimbuerger, который предоставляет атрибуты errorno и strerror. – Don Kirkby 5 February 2013 в 21:06
  • 3
    Как бы я обернул произвольное Error, например. ValueError, в RuntimeError, поймав Exception? Если я воспроизведу ваш ответ для этого случая, стек будет потерян. – Karl Richter 18 April 2014 в 20:20
  • 4
    Я не уверен, что вы спрашиваете, @karl. Можете ли вы опубликовать образец в новом вопросе, а затем ссылку на него отсюда? – Don Kirkby 20 April 2014 в 07:48
  • 5
    Я отредактировал свой дубликат вопроса о OP в stackoverflow.com/questions/23157766/… с очисткой с учетом вашего ответа напрямую. Мы должны обсудить там :) – Karl Richter 20 April 2014 в 13:30
165
ответ дан Flimm 24 August 2018 в 07:24
поделиться
  • 1
    raise ... from ... - действительно правильный способ сделать это в Python 3. Это требует большего количества оборотов. – Nakedible 26 April 2013 в 17:30
  • 2
    Nakedible Я думаю, что это потому, что, к сожалению, большинство людей все еще не используют Python 3. – Tim Ludwinski 24 December 2013 в 20:24
  • 3
    Это, похоже, происходит даже при использовании 'from' в python 3 – Steve Vermeulen 6 June 2015 в 02:22
  • 4
    Может быть обращено на Python 2. Надеюсь, что это когда-нибудь. – Marcin Wojnarski 3 September 2015 в 22:27
  • 5
    @ogrisel Вы можете использовать пакет future для достижения этого: python-future.org/compatible_idioms.html#raising-exceptions Например. from future.utils import raise_ и raise_(ValueError, None, sys.exc_info()[2]). – jtpereyda 18 February 2016 в 02:41
2
ответ дан geekQ 24 August 2018 в 07:24
поделиться
  • 1
    Это Python 2 & amp; 3 совместимое решение! Благодаря! – andychase 6 November 2013 в 09:26
  • 2
    Думаю, идея заключалась в том, чтобы поднять другой тип исключения. – Tim Ludwinski 24 December 2013 в 20:26
  • 3
    Это не цепочка вложенных исключений, просто повторное одно исключение – Karl Richter 18 April 2014 в 19:32
  • 4
    Это лучшее решение python 2, если вам просто нужно обогатить сообщение об исключении и получить полную трассировку стека! – geekQ 4 April 2017 в 08:54
9
ответ дан ilya n. 24 August 2018 в 07:24
поделиться
  • 1
    TypeError: raise: arg 3 должен быть traceback или None – Glenn Maynard 29 August 2009 в 20:10
  • 2
    Извините, я допустил ошибку, так или иначе я подумал, что она также принимает исключения и автоматически получает атрибут traceback. Согласно docs.python.org/3.1/reference/… , это должно быть e .__ traceback__ – ilya n. 29 August 2009 в 22:05
  • 3
    @ilyan .: Python 2 не имеет атрибута e.__traceback__! – Jan Hudec 4 November 2013 в 13:08
5
ответ дан ire_and_curses 24 August 2018 в 07:24
поделиться
  • 1
    Но, конечно, в Perl5 вы можете просто сказать «признаться qq {OH NOES! $ @} & Quot; и не потерять трассировку стека других исключений. Или вы можете реализовать свой собственный тип, который сохраняет исключение. – jrockway 29 August 2009 в 09:53
[g1] Для максимальной совместимости между Python 2 и 3 вы можете использовать [f2] в библиотеке [f3]. [g0] https://six.readthedocs.io/#six.raise_from [/g0]. Вот ваш пример (слегка измененный для ясности): [/g1] [f1]
0
ответ дан LexieHankins 6 November 2018 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: