В Dart есть способ пометить функцию как исключение? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытался найти способ Flutter / Dart, чтобы отметить функцию, которая может вызвать исключение во время ее выполнения. После некоторого времени поиска в документации и Google я не нашел никакого способа сделать это.

На другом языке, например, Swift, Java, Kotlin, et c Я знаю, что у нас есть такие механизм. Пример кода в Swift:

func doSomething() throws { ... }

Кто-нибудь знает, существует ли он в Dart? Я думаю, что это будет полезно.

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

Заранее спасибо!

1 Ответ

4 голосов
/ 13 февраля 2020

В Dart нет способа пометить функцию как потенциально выбрасываемую.

Предполагается, что все функции потенциально могут выбрасывать (если не по какой-либо другой причине, то из-за нехватки памяти или стека) ситуация переполнения).

Если вы посмотрите на Swift, throws составляет около исключений , а не ошибок. Дарт не различает guish два, вы можете бросить все, что угодно. Swift поставил себя в положение между Java («должны объявить все брошенные исключения») и Dart или C# («не может объявить исключения»).

Пометка функции как «throwing» не помогает компилятору в любом случае, потому что он должен предполагать, что все остальные функции тоже могут. Подход Swift призван гарантировать, что четко обозначенные исключения не будут проигнорированы. Если вы не хотите, то вы можете try! их и превратить исключение в ошибку.

Если функция выдает как часть обычного использования, вы должны document в функции документация.

Дарт также имеет проблему с функцией types . Является ли функция от int до int того же типа, что и другая функция от int до int, если последняя может выдавать? Разделение типов функций на бросание и не бросание быстро усложняются. Тем более, если вы хотите указать что выдает. Это не невозможно, но это еще одно осложнение.

Единственное, что вы получите с обновлением безопасности Dart null (в настоящее время над ним работаете), это способ заявить, что функция всегда броски. Если вы сделаете тип возврата Never в нулевом безопасном коде, то система типов не позволит вам вернуть любое значение, и, поскольку функция завершается либо возвратом значения, либо бросая, вызов функции с типом возврата Never может только закончиться броском.

...