To broad exception clause

Avoiding «Too broad exception clause» warning in PyCharm

I’m writing an exception clause at the top level of a script, and I just want it to log whatever errors occur. Annoyingly, PyCharm complains if I just catch Exception .

Is there something wrong with this handler? If not, how can I tell PyCharm to shut up about it?

4 Answers 4

From a comment by Joran: you can use # noinspection PyBroadException to tell PyCharm that you’re OK with this exception clause. This is what I was originally looking for, but I missed the option to suppress the inspection in the suggestions menu.

If you don’t even want to log the exception, and you just want to suppress it without PyCharm complaining, there’s a new feature in Python 3.4: contextlib.suppress() .

That’s equivalent to this:

I am reluctant to turn off warnings as a matter of principle.

In the case presented, you know well what the exception is. It might be best to just be specific. For example:

If there are a couple of possible exceptions, you could use two except clauses. If there could be a multitude of possible exceptions, should one attempt to use a single try-block to handle everything? It might be better to reconsider the design!

Not sure about your PyCharm version (mine is 2019.2), but I strongly recommend disabling this PyCharm inspection in File> Settings> Editor> Inspections and type «too broad». In Python tab, deselect «too broad exceptions clauses» to avoid those. I believe this way PyCharm would show you the correct expression inspection

I found a hint in this closed feature request for PyCharm:

I suggest you to mark this inspection as ‘okay’ if the except block makes use of exception instance e somehow.

Because I’m logging with exc_info=True , I’m implicitly using the current exception object, but PyCharm doesn’t know that. To make it explicit, I can pass the exception object to exc_info . Since Python 3.5, the logger methods have accepted an exception instance to report, as well as accepting any truthy value to report the current exception and stack trace in the log.

Источник

Как избежать предупреждения «Слишком широкое исключение» в PyCharm

Я пишу предложение об исключении на верхнем уровне скрипта, и я просто хочу, чтобы оно регистрировало любые ошибки. Досадно, что PyCharm жалуется, если я просто поймаю Exception .

Что-то не так с этим обработчиком? Если нет, как я могу сказать PyCharm заткнуться об этом?

Читайте также:  Bravo 04 error division 2

4 ответа

Из комментария Джорана: вы можете использовать # noinspection PyBroadException , чтобы сообщить PyCharm, что вы согласны с этим пункт об исключении. Это то, что я изначально искал, но я упустил возможность подавить осмотр в меню предложений.

Если вы даже не хотите регистрировать исключение и хотите просто подавить его без жалоб PyCharm, в Python 3.4 есть новая функция: contextlib.suppress() .

Это эквивалентно этому:

Не уверен насчет вашей версии PyCharm (у меня 2019.2), но я настоятельно рекомендую отключить эту проверку PyCharm в «Файл»> «Настройки»> «Редактор»> «Проверки» и ввести «слишком широкий». На вкладке Python отмените выбор «слишком широкие исключения», чтобы избежать их. Я считаю, что таким образом PyCharm покажет вам правильную проверку выражения

Я не хочу отключать предупреждения в принципе.

В представленном случае вы хорошо знаете, что такое исключение. Лучше всего быть конкретным. Например:

Если есть несколько возможных исключений, вы можете использовать два, кроме предложений. Если может быть множество возможных исключений, следует ли пытаться использовать один блок try для обработки всего? Может быть, лучше пересмотреть дизайн!

Я нашел подсказку в этом закрытом запросе функции для PyCharm:

Я предлагаю вам пометить эту проверку как «хорошо», если блок исключения каким-либо образом использует экземпляр исключения e .

Поскольку я регистрируюсь с exc_info=True , я неявно использую текущий объект исключения, но PyCharm этого не знает. Чтобы сделать это явным, я могу сделать что-то немного странное: exc_info может использовать любое истинное значение для включения трассировки стека в журнал. Объект исключения должен быть правдивым, потому что это не None .

Источник

To broad exception clause

#python #warnings #try-except

#python #предупреждения #попытка исключения

Вопрос:

Недавно у меня возникла проблема при написании кода на Python в редакторе PyCharm. Всякий раз, когда я делал оператор try-except, я по какой-то причине получал предупреждение (желтая строка под словом: except)

Когда я пишу этот точный код в PyCharm, я получаю предупреждение. Когда я навожу курсор мыши на предупреждение, в нем говорится:

Есть идеи, почему это происходит?

Комментарии:

1. Голый except будет перехватывать все типы исключений, и, согласно PEP8, делать это не рекомендуется. Хорошей практикой является конкретизация. В вашем случае вы хотели бы перехватывать только IndexError исключения, выполняя: except IndexError: .

Ответ №1:

При перехвате исключений по возможности указывайте конкретные исключения вместо использования простого предложения except: .

Простое предложение except: перехватит исключения SystemExit и KeyboardInterrupt, что затруднит прерывание программы с помощью Control-C и может скрыть другие проблемы. Если вы хотите перехватить все исключения, которые сигнализируют об ошибках программы, используйте except Exception: (bare except эквивалентно except BaseException: ) .

Хорошее эмпирическое правило — ограничить использование голых предложений ‘except’ двумя случаями:

Читайте также:  Moza aircross 2 обновление прошивки

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

Если код должен выполнить некоторую очистку, но затем позволяет исключению распространяться вверх с помощью raise . try …finally может быть лучшим способом справиться с этим случаем.

Источник

Considerate Code

How not to handle an exception in Python

Have a look at this piece of code:

Can you spot the anti-pattern?

The first thing that hits the eye is the overly broad except clause. You want to be as specific as possible when catching exceptions, but at the very least, you should limit the except clause to the class Exception . The class hierarchy of the Python’s built-in exception explains why:

If you do not specify an exception class in an except clause, it will also catch SystemExit and KeyboardInterrupt , preventing you from stopping the program.

In the rare case where you actually want to catch BaseException , I would suggest explicitly spelling out except BaseException instead of just using except without a class to make your intention obvious.

Furthermore, the log message is not really helpful. It only tells you that an exception occurred, but what kind of exception that was, that remains a mystery.

Here is a slightly improved version of the code above:

The except clause is still very broad but if you want to make sure that all messaged get processed, it might be warranted. The log output now also contains the exception and is much more helpful. Or is it?

The log message might just say:

The reason for this terse output is that the string representation of an exception only contains the message of the exception. If you have stared at code for long enough, you might be able to make sense of this message, just like the code of the Matrix reveals its mysteries to an experienced operator.

The canonical string representation that you get with repr() or the format parameter ‘%r’ is slightly better:

The log messages would now be:

This is better and might be enough to spot the error if process() is really simple. But if it is moderately complex, it will just leave you scratching your head.

What you really want to know is not only what kind of exception occurred, but also where. That means you need a stack trace.

If you are using the built-in logging module, you can simply use logger.exception() instead of logger.error() and it will print the stack trace for you:

Now we are getting somewhere:

Now we know exactly where the exception is occurring and what kind of exception it is. There is only one valuable piece of information missing: the relevant state of your program that triggers this exception.

Читайте также:  Prestigio wize 3401 3g прошивка кастомная

What state is relevant depends on your application. For our example, we can keep it simple and just log the argument message :

Now our log messages paint a complete picture:

The first error happens because message is simply None . The second error happens because process() tries to access the key body , but message is an empty dictionary.

Источник

Should I always specify an exception type in `except` statements?

When using PyCharm IDE the use of except: without an exception type triggers a reminder from the IDE that this exception clause is Too broad .

Should I be ignoring this advice? Or is it Pythonic to always specific the exception type?

7 Answers 7

It’s almost always better to specify an explicit exception type. If you use a naked except: clause, you might end up catching exceptions other than the ones you expect to catch — this can hide bugs or make it harder to debug programs when they aren’t doing what you expect.

For example, if you’re inserting a row into a database, you might want to catch an exception that indicates that the row already exists, so you can do an update.

If you specify a bare except: , you would also catch a socket error indicating that the database server has fallen over. It’s best to only catch exceptions that you know how to handle — it’s often better for the program to fail at the point of the exception than to continue but behave in weird unexpected ways.

One case where you might want to use a bare except: is at the top-level of a program you need to always be running, like a network server. But then, you need to be very careful to log the exceptions, otherwise it’ll be impossible to work out what’s going wrong. Basically, there should only be at most one place in a program that does this.

A corollary to all of this is that your code should never do raise Exception(‘some message’) because it forces client code to use except: (or except Exception: which is almost as bad). You should define an exception specific to the problem you want to signal (maybe inheriting from some built-in exception subclass like ValueError or TypeError ). Or you should raise a specific built-in exception. This enables users of your code to be careful in catching just the exceptions they want to handle.

Источник

Smartadm.ru
Adblock
detector