.net - 异常处理中的选项与异常

标签 .net exception-handling f# option

使用 F# option 类型一段时间后,我意识到它可以用于处理异常情况。在以下示例中,我可以使用 optionException:

  • List/Array/Seq 模块中的 find 函数在不常见的情况下会引发 KeyNotFoundException,而对应的 tryFind 在这些情况下会返回 None
  • 当我进行回溯(解决 N 皇后、数独等问题)时,只要分支没有解决方案,我可以引发异常并稍后捕获它,或者返回 None 以匹配该值以进行回溯。在我们找到解决方案之前,这些情况经常发生。

  • 我的印象是 option 是一种更实用的方法,而 Exception 在.NET平台中更常用。
    optionException在可用性、性能等方面的异常处理有什么区别?在哪些情况下使用一种技术比使用另一种更好?

    最佳答案

    CLR 使得抛出和捕获异常的操作极其昂贵。仅出于这个原因,您应该更喜欢像 Option 这样的构造来报告预期的失败。如果故障确实异常且几乎无法恢复,请继续抛出异常。但正如您所注意到的,在搜索过程中回溯之类的事情并不异常(exception),如果您在异常情况下实现它们,您会发现您的性能会受到很大影响。

    因为这是 CLR 的一个属性,所以你是否在 F# 中并不重要。我的理解是类似 ML 语言的其他运行时,例如ocaml 没有这个特性,因此可能会更频繁地使用异常来进行控制流。

    关于.net - 异常处理中的选项与异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952625/

    相关文章:

    .net-4.0 - TaskEx.WhenAll 和异常

    java - Spring:RestController 和 Controller 的不同异常处理程序

    php - 如何在 Laravel 5 中设置自定义异常处理程序?

    f# - 在 FsCheck 中,如何生成非负字段的测试记录?

    .net - 使用 PowerShell 类调用 "[namespace.class]::method"样式命令

    c# - 使用反射确定 C# 中引用类型的可空性

    c# - iPhone 中使用 .NET 生成的公钥进行 RSA 加密?

    c# - 有没有一种方法可以防止注入(inject)在 ASP.NET 中多次注册的接口(interface)的单一实现?

    f# - 创建一个只有一些消息得到响应的代理?

    http - 从 C# 移植到 F# 时出现 System.Net.WebException