Error handling 用户定义错误的专有处理/收集

Error handling 用户定义错误的专有处理/收集,error-handling,f#,Error Handling,F#,我不知道如何在不使用异常(即failwith….标准系统异常)的情况下实现用户定义错误(例程/算法停止)或警告消息(例程/算法可以继续)的专有处理过程 示例:我有一个具有一系列功能的模块,该模块使用大量输入数据进行检查,并用于计算压力容器组件的厚度 计算过程是复杂的、迭代的,在得到结果之前需要执行很多检查,这些检查可能会生成“用户定义的错误”,从而停止程序/例程/算法或生成“警告消息” 我需要收集这些错误和消息,以专用的形式(Wpf或Windows形式)显示给用户。这件事后来才结束 注意:每次我

我不知道如何在不使用异常(即failwith….标准系统异常)的情况下实现用户定义错误(例程/算法停止)或警告消息(例程/算法可以继续)的专有处理过程

示例:我有一个具有一系列功能的模块,该模块使用大量输入数据进行检查,并用于计算压力容器组件的厚度

计算过程是复杂的、迭代的,在得到结果之前需要执行很多检查,这些检查可能会生成“用户定义的错误”,从而停止程序/例程/算法或生成“警告消息”

我需要收集这些错误和消息,以专用的形式(Wpf或Windows形式)显示给用户。这件事后来才结束

注意:每次我读F#或C#或Visual basic的书籍或Internet上的文章时,我都会发现相同的发展观/警告:系统/用户定义异常的出现应尽可能受到限制:异常是针对不可管理的异常事件(不可预测),并导致计算机系统“过载”

我不知道该实施哪种处理理念。我很困惑。互联网上关于这一特殊论点的资料有限

事实上,我正计划采用这一哲学,取自:“。听起来对我很好。。。复杂,但很好。我找不到关于这个相关论点的其他参考资料

问题:我可以考虑创建这个用户定义错误的专有处理/收集的其他哲学吗?一些书要读还是一些文章

我的决定将对如何设计和编写我的代码产生重大影响(将问题分解为几个函数,生成一个按顺序函数运行的“马达”,或根据结果以不同的方式组合,在何处检查错误/警告,如何存储错误和警告消息以了解发生了什么或在何处“错误/警告”是生成的,由“哪个函数”?)引起

非常感谢。

F#方法是尽可能多地对类型中的错误进行编码。最简单的示例是一个选项类型,如果操作失败,当操作成功时,您将返回
None
。令人惊讶的是,这通常就足够了!如果没有,那么您可以对不同类型的错误进行编码D在一个受歧视的联盟中成功的“国家”,例如

[<Measure>]
type psi

type VesselPressureResult =
    | PressureOk
    | WarningApproachingLimit
    | ErrorOverLimitBy of int<psi>
[]
psi型
类型容器压力结果=
|压力测试
|警告方法
|ErrorOverLimitBy of int
然后,您将使用模式匹配来“决定”在每种情况下要执行的操作。如果您需要添加更多变体,例如
ErrorTooLow
,那么您可以将其添加到DU中,然后编译器将“告诉”您需要修复逻辑的所有位置


下面是一个完美的详细信息来源:

我认为Scott Wlaschin()提出的解决方案是像F#这样的函数式语言的最佳解决方案,即使它不是那么直接。即使我觉得自己像一只“熊”(请参阅),我也认为这是唯一的方法!看看里面:“Microsoft.FSharp.Core.Result" ... 已经实现了面向铁路的编程(BASIC)!一个惊喜!!!见: