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

Ошибка против исключения в дротике

Почему в Dart есть ошибки и исключения, а не ошибки или исключения?

Является ли причина исторической или какой?

Я могу выбросить ошибку, я могу выбросить исключение. Ни один из них не проверяется анализатором, как в Java (исключение или исключение RuntimeException)

4b9b3361

Ответ 1

Из этого сообщения, цитируя Боба Нистрома:

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

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

За исключением нескольких особых обстоятельств, идиоматический Дарт должен бросить Ошибки, но никогда их не поймать. Они существуют специально, чтобы не быть пойманы так, что они снимут приложение и предупреждают программиста о том, местоположение ошибки.

Другими словами, вы должны ожидать (и проверять) исключения (предполагается, что вы должны их обработать). Если вы получаете сообщение об ошибке, то вам нужно проверить, как вы используете API, который бросает ошибку - вы, вероятно, используете ее неправильно.

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

Ответ 2

Исключение

Exception в Dart должен быть выдан для обычного ожидаемого выполнения программы и предназначен для перехвата:

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

Пример: TimeoutException

TimeoutException будет выброшено "когда запланированный тайм-аут случится во время ожидания асинхронного результата", что является ожидаемым потоком программы.
Если у нас есть задача загрузки, например, и эта задача загрузки не завершена по истечении заданного нами времени ожидания в тридцать секунд (что может произойти), мы хотим сообщить об этом нашему пользователю, поэтому нам необходимо catch Exception.

Ошибка Error в Dart должен быть брошен для неожиданного выполнения программы, и не должен быть перехвачен, но должен быть решен программистом:

Объект Error представляет программный сбой, которого программист должен был избежать.

Пример: AssertionError

AssertionError выбрасывается "когда утверждение assert не выполнено", то есть это никогда не должно происходить, потому что мы assert этого не делаем.
Если мы видим такую ошибку, это означает, что мы должны изменить наш код, и мы определенно не должны ее отлавливать.


На практике вы можете поймать Error, но не должны. Существует правило линтера, чтобы помочь обеспечить это.


Смотрите этот ответ для полного примера сценария.