Dart 中有没有办法将函数标记为抛出异常?

Gab*_*i D 6 try-catch throw dart flutter

我试图在 Flutter/Dart 中找到一种方法来标记一个在执行过程中可能抛出异常的函数。在文档和谷歌中搜索一段时间后,我没有找到任何方法。

在其他语言中,例如 Swift、Java、Kotlin 等,我知道我们有这样的机制。Swift 中的示例代码是:

func doSomething() throws { ... }
Run Code Online (Sandbox Code Playgroud)

有谁知道这在 Dart 中是否存在?我认为它会很有用。

如果由于 Dart 语言设计它不存在,那么也许任何人都可以解释这个决定背后的原因。

提前致谢!

lrn*_*lrn 10

Dart 无法将函数标记为可能抛出。

应该假定所有函数都可能抛出(如果没有其他原因,则是因为内存不足或堆栈溢出情况)。

如果你看看 Swift,它throws是关于异常,而不是错误。Dart 不区分两者,你可以扔任何东西。Swift 将自己置于 Java(“必须声明所有抛出的异常”)和 Dart 或 C#(“无法声明异常”)之间的位置。

将函数标记为“抛出”对编译器没有任何帮助,因为它必须假设所有其他函数也可能如此。Swift 方法是为了确保不会忽略显着标记的异常。除非您愿意,否则您可以使用try!它们并将异常转换为错误。

如果函数确实作为正常使用的一部分抛出,您应该在函数的文档中记录它。

Dart 也有函数类型的问题。从功能intint同类型的其他功能,从intint,如果后者能够抛出?将函数类型分为抛出和非抛出会很快变得复杂。如果您想指定它抛出的内容,则更是如此。这并非不可能,但这是一种复杂的情况。

您将通过 Dart 空安全更新(目前正在处理)获得的一件事是一种声明函数始终抛出的方法。如果您在返回类型Never的空安全的代码,那么该类型系统会阻止您返回任何值,因为函数调用必须由返回值或抛出,调用一个函数的返回类型结束Never可以结束通过投掷。

  • 流星也可以随时击碎你。这并不意味着我们不应该在车内安装安全带。我通过尝试了解 File.writeAsBytes() 是否会抛出错误找到了这个主题。就我而言,查看源代码并了解它的作用会更容易。但是,如果您无法访问源代码并且代码没有完整记录,您可能会无缘无故地遇到很多崩溃。就我个人而言,我更喜欢快速处理这个问题的方法。 (4认同)