Предположим, у меня есть следующий сценарий:Поднять исключение из области вызова?
def do_not_call_on_one(i):
if i == 1:
raise ValueError("You never listen.")
print "Success!"
do_not_call_on_one(1)
На excution, вы увидите следующее отслеживающий:
Traceback (most recent call last):
File "test.py", line 7, in <module>
do_not_call_on_one(1)
File "test.py", line 3, in do_not_call_on_one
raise ValueError("You never listen.")
ValueError: You never listen.
Есть ли какой-нибудь способ манипулировать стек вызовов, так что ошибка вылетает из линия, которая на самом деле вызывает проблему, как и ?:
Traceback (most recent call last):
File "test.py", line 7, in <module>
do_not_call_on_one(1)
ValueError: You never listen.
Это позволит сэкономить время разработчиков, которые иначе были бы впустую сканирование вызов стека, поиск некорректно используемой функции, когда правильное поведение может быть определено заранее.
Есть ли что-нибудь в Python, позволяющее исключению использовать измененную трассировку?
Обновления
Есть buitins, которые копируют эту функциональность:
# In test.py:
int('a')
# Executing 'python test.py' yields:
Traceback (most recent call last):
File "test.py", line 1, in <module>
int('a')
ValueError: invalid literal for int() with base 10: 'a'
Примечания: отслеживающие не опускается в функцию int()
, чтобы отобразить кучу ненужных областей (особенно бесполезен raise ValueError
сам).
Полезно знать, где именно была заброшена ошибка, о которой вы могли бы избавиться. Если бы одна и та же ошибка могла быть сброшена из двух разных точек, вы точно не знаете, где искать. – FastTurtle
Спасибо JAB. Я должен работать над своим поиском-fu: '( – gepoch
Нет, это не дубликат. С одной стороны, связанная статья с точки зрения библиотеки USER, которая не хочет видеть внутренние элементы библиотеки, это с точки зрения из библиотеки AUTHOR, которая не хочет делать SHOW внутренности, а для другого - это QUITE, что нужно сделать: Perl делает это все время в модуле Carp. Не похоже на Python? – Ian