Не показывать строку Python в строке исключений - PullRequest
21 голосов
/ 12 декабря 2010

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

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

Ответы [ 3 ]

7 голосов
/ 12 декабря 2010

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

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

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

4 голосов
/ 25 ноября 2016

вы можете создать свой собственный обработчик исключений в 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.

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

0 голосов
/ 13 июня 2015

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

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

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

абонент

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

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

...