Исключение переповышения с другим типом и сообщением, сохраняя существующую информацию

Просто измените определение вашей переменной:

const x = this.props.form.getFieldValue('product_gender', x => console.log(x));
128
задан bignose 4 February 2016 в 05:14
поделиться

3 ответа

Python 3 представил цепочку исключений (как описано в PEP 3134 ). Это позволяет при возникновении исключения ссылаться на существующее исключение в качестве «причины»:

try:
    frobnicate()
except KeyError as exc:
    raise ValueError("Bad grape") from exc

Таким образом, перехваченное исключение становится частью (является «причиной») нового исключения и доступно любому коду, перехватывающему новое исключение.

С помощью этой функции атрибут __ причиной __ установлено. Встроенный обработчик исключений также знает, как сообщать «причину» и «контекст» исключения вместе с трассировкой.


В Python 2 , похоже, этот вариант использования имеет нет хорошего ответа (как описано Яном Бикингом и Недом Бэтчелдером ). Облом.


В Python 2 кажется, что этот вариант использования не имеет хорошего ответа (как описано Ианом Бикингом и Недом Батчелдером ). Облом.


В Python 2 кажется, что этот вариант использования не имеет хорошего ответа (как описано Ианом Бикингом и Недом Батчелдером ). Облом.

177
ответ дан 24 November 2019 в 00:39
поделиться

Можно использовать sys.exc_info (), чтобы получить traceback и повысить новое исключение со сказанным traceback (как PEP упоминает). Если Вы хотите сохранить старый тип и сообщение, можно сделать так на исключении, но это только полезно, если безотносительно выгод исключение ищет его.

Например,

import sys

def failure():
    try: 1/0
    except ZeroDivisionError, e:
        type, value, traceback = sys.exc_info()
        raise ValueError, ("You did something wrong!", type, value), traceback

Конечно, это действительно не настолько полезно. Если бы это было, то нам не был бы нужен тот PEP. Я не рекомендовал бы делать его.

36
ответ дан Devin Jeanpierre 24 November 2019 в 00:39
поделиться

Вы могли создать свой собственный тип исключительной ситуации, который расширяется, какой бы ни исключение Вы поймали.

class NewException(CaughtException):
    def __init__(self, caught):
        self.caught = caught

try:
    ...
except CaughtException as e:
    ...
    raise NewException(e)

Но большую часть времени, я думаю, что было бы более просто поймать исключение, обработать его, и также raise исходное исключение (и сохраняют traceback), или raise NewException(). Если бы я называл Ваш код, и я получил одно из Ваших пользовательских исключений, то я ожидал бы, что Ваш код уже обработал любое исключение, которое необходимо было поймать. Таким образом я не должен получать доступ к нему сам.

Править: Я нашел этот анализ способов выдать Ваше собственное исключение и сохранить исходное исключение. Никакие симпатичные решения.

11
ответ дан Nikhil Chelliah 24 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

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