Подтвердить что ты не робот

Не показывать линию подъема Python в стеке исключений

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

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

4b9b3361

Ответ 1

Должное предупреждение: изменение поведения интерпретатора обычно недооценивается. И в любом случае, когда именно возникает ошибка, может быть полезно при отладке, особенно если функция может вызвать ошибку по нескольким причинам.

Если вы используете модуль traceback и замените sys.excepthook на пользовательскую функцию, возможно, это возможно. Но внесение изменений повлияет на отображение ошибок для всей программы, а не только для вашего модуля, поэтому, вероятно, не рекомендуется.

Вы также можете посмотреть на ввод кода в try/except blocks, а затем на изменение ошибки и повторное повышение. Но ваше время, вероятно, лучше потрачено на непредсказуемые неожиданные ошибки и написание информационных сообщений об ошибках для тех, которые могут возникнуть.

Ответ 2

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

import sys
import traceback

def exceptionHandler(got_exception_type, got_exception, got_traceback):
    listing  = traceback.format_exception(got_exception_type, got_exception, got_traceback)
    # Removing the listing of statement raise (raise line). 
    del listing[-2]
    filelist = ["org.python.pydev"] # avoiding the debuger modules.
    listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ]
    files = [line for line in listing if line.startswith("  File")]
    if len(files) == 1:
        # only one file, remove the header.
        del listing[0]
    print>>sys.stderr, "".join(listing)

И ниже приведены некоторые строки, которые я использовал в моем коде исключения.

sys.excepthook = exceptionHandler
raise Exception("My Custom error message.")

В исключении метода вы можете добавлять имена файлов или имена модулей в список "имена файлов", если вы хотите игнорировать любые нежелательные файлы. Поскольку я проигнорировал модуль python pydev, так как я использую отладчик pydev в eclipse.

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

Ответ 3

Я бы предложил не использовать механизм Exception для проверки аргументов, как это заманчиво. Кодирование с исключениями как условные выражения похоже на высказывание "сбой моего приложения, если, как разработчик, я не думаю обо всех плохих условиях, которые могут возникнуть в моих аргументах. Возможно, использование исключений для вещей не только из-под вашего контроля, но и под управлением чего-то другого, такого как ОС или аппаратное обеспечение или язык Python, будет более логичным, я не знаю. На практике, однако, я использую исключения, когда вы запрашиваете решение для.

Чтобы ответить на ваш вопрос, отчасти, так же просто закодировать:

class MyObject(object):
    def saveas(self, filename):
        if not validate_filename(filename):
            return False
        ...

абонент

if not myobject.saveas(filename): report_and_retry()

Возможно, это не отличный ответ, просто о чем подумать.