Как игнорировать все потенциальные исключения в Python?
Я пишу собственный скрипт резервного копирования на Python. Иногда функция mkdir, функция печати или любая другая функция не работают по разным причинам. Такие исключения останавливают весь сценарий и останавливают резервное копирование в середине, что очень расстраивает. До сих пор я справлялся с этими проблемами, добавляя операторы try: ... кроме:... и правильно обрабатывая эти исключения. Однако однажды другой оператор или функция может также вызвать исключение по какой-то другой причине, которая еще не сработала.
Есть ли способ сказать сценарию, чтобы продолжить в любом случае? Эквивалент обертывания каждого отдельного утверждения кода в предложении try: ... кроме: pass? Журнал был бы лучше, конечно.
Я заметил, что при программировании с помощью инструментария GUI, такого как Tkinter, приложение продолжает работать, даже если возникают исключения. Можно ли выполнить этот тип вещи с помощью консоли?
7 ответов
Python не может этого сделать, и на то есть веские причины.
Кажется, вы не понимаете, что значит писать "надежное" программное обеспечение: надежная программа - это не программа, которую трудно убить и которая будет продолжать работать, несмотря ни на что, а программа, которая будет правильно обрабатывать крайние случаи. Продолжать бегать недостаточно. Ключевой момент - продолжать делать разумные вещи.
К сожалению, нет способа делать разумные вещи автоматически, и вы должны думать в каждом конкретном случае, как справиться с ошибкой.
Помните, что если в программе много catch
это редко хорошая программа. Исключения должны возникать во многих местах и встречаться почти нигде.
Обратите внимание, что каждый catch
потенциально является источником ошибок... например:
try:
print my_dict[foo()]
except KeyError:
...
не может отличить, если KeyError
приходит для доступа к несуществующему ключу в my_dict
или если вместо этого сбежал из foo()
, Редко два случая должны рассматриваться одинаково...
Лучше написать:
key = foo()
if key in my_dict:
print my_dict[key]
else:
...
так что только боковой корпус отсутствует ключ в my_dict
обрабатывается и вместо KeyError
Исключение остановит программу (единственная разумная вещь, которую нужно сделать - это остановить программу, если вы не уверены в том, что она делает).
На самом деле есть модуль, который должен делать именно это: https://github.com/ajalt/fuckitpy.
Хотя это явно было написано как шутка. Я не могу представить ситуацию, когда делать что-то подобное - хорошая идея. Боже, я не могу поверить, что я даже предлагаю это как решение.
Вместо этого вам следует определить, какие строки кода могут вызвать ошибки, и правильно их обработать. Есть только так много мест, где ошибки могут действительно происходить - в основном при взаимодействии с внешними системами, включая файловую систему, сеть, ввод данных пользователем и т. Д. И помните, что на самом деле сбой часто лучше, чем продолжать "работать" и портить ваши данные, файлы и т. Д. на. Исключения существуют по какой-то причине, они не являются результатом злого умысла Гвидо.
Python имеет BaseException в качестве базового класса для классов исключения. Вы можете поймать и игнорировать базовый класс Exception, который охватит все исключения.
try
... your code here ...
except BaseException as exp:
print "A General Exception Occurred"
try:
# code segment
except:
pass
ключевое словоpass игнорирует все исключения
Новый ответ для нового поколения ...
Python теперь поставляется с suppress(), это говорит интерпретатору подавлять указанные исключения во время работы.
Может быть легко импортирован, как показано ниже
from contextlib import suppress
with suppress(ValueError):
int('this wont catch')
print('yea')
Вышеупомянутое будет работать, не вызовет исключение ValueError для изменения недопустимой строки int на int ...
Это более чисто, чем сторонние библиотеки.
Удачного взлома
Обычно этот должен поймать все:
try:
....
except:
pass
Единственная проблема в том, что вы не получите объект исключения с этим синтаксисом, но в этом случае это не запрашивалось.
Вы можете добавить общий блок, кроме предложенного @Kanwar Saad. Вопрос в том, можете ли вы продолжить свою программу в допустимом состоянии после возникновения исключения?
Из дзен питона:
Errors should never pass silently.
Unless explicitly silenced.
Попытка поймать все исключения, которые вы знаете, по моему мнению, является лучшим способом. Если вы не можете явно перехватить исключение, вы не должны пытаться обходить его. Вы (и ваши пользователи) должны знать, что именно пошло не так, иначе ваш код может стать кошмаром для отладки.
Если вы беспокоитесь о потере данных резервного копирования, возможно, вы могли бы сделать что-то вроде этого:
def save_unfinished_backup():
# try to find a graceful exit without losing any data
try:
# some code
except OSError:
# handle oS Errors
except Exception:
save_unfinished_backup()
raise
Таким образом, вы получаете и шанс на потерю данных, и точную ошибку для их отладки.
Надеюсь, это поможет!
На забавное замечание: вы также можете использовать модуль fuckit. Что заставляет замолчать ВСЕ ошибки, в том числе синтаксические ошибки. Но никогда не используйте это в продуктивном коде.
Это должно работать отлично. Это не будет печатать "фу", но вы достигнете print("bar")
без сбоев.
import fuckit
with fuckit:
prnt("foo")
print("bar")