【问题标题】:Is there a way in Dart to mark a function as throwing an exception?Dart 中有没有办法将函数标记为抛出异常?
【发布时间】:2020-02-13 12:36:19
【问题描述】:

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

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

func doSomething() throws { ... }

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

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

提前致谢!

【问题讨论】:

    标签: flutter dart try-catch throw


    【解决方案1】:

    在 Dart 中没有办法将函数标记为可能抛出。

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

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

    将函数标记为“抛出”对编译器没有任何帮助,因为它必须假设所有其他函数也可以。 Swift 方法可确保不忽略明显标记的异常。除非你愿意,否则你可以try!他们并将异常变成错误。

    如果函数在正常使用过程中确实抛出异常,您应该在函数的文档中记录它。

    Dart 还有函数types的问题。从intint 的函数是否与从intint 的另一个函数的类型相同,如果后者可以抛出?将函数类型分为 throwing 和 non-throwing 很快就会变得复杂。如果你想指定它抛出的 what,更是如此。这并非不可能,但又是一种复杂情况。

    您将通过 Dart 空安全更新(目前正在处理)获得的一件事是一种声明函数 总是 抛出的方式。如果您在 null 安全代码中设置返回类型 Never,那么类型系统将阻止您返回任何值,并且由于函数调用必须以返回值或抛出结束,因此对具有返回类型的函数的调用Never只能以投掷结束。

    【讨论】:

    • 流星也可以随时粉碎你。这并不意味着我们不应该在汽车上放置安全带。我通过尝试了解 File.writeAsBytes() 是否会引发错误来找到这个主题。就我而言,只查看源代码并了解它的作用更容易。但是,如果您无法访问源代码并且代码没有很好的文档记录,那么您可能会无缘无故地发生很多崩溃。就个人而言,我更喜欢快速处理这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多