我不知道如何在不使用异常(即failwith .... Standard System Exception)的情况下实现用户定义的错误(例程/算法停止)或警告消息(例程/算法可以继续)的专有处理过程。 / p>
示例:我有一个带有一系列功能的模块,该模块使用大量输入数据进行检查并用于计算压力容器组件的厚度。
计算过程复杂,反复,在获得结果之前需要进行很多检查,检查可以生成“用户定义的错误”,从而停止过程/例程/算法或生成“警告消息”上。
我需要收集这些错误和消息以专用形式(Wpf或Windows形式)显示给用户。稍后再说。
注意:每次阅读F#或C#或Visual Basic或Internet上的文章时,我都会发现相同的哲学/警告:应尽可能限制系统/用户定义的异常的产生:异常用于无法处理的异常事件(不可预测),并导致计算机系统“超载”。
我不知道要实施哪种处理方式。我很困惑。互联网上有关此特定论点的资源有限。
实际上,我计划采用此哲学,摘自:“ https://fsharpforfunandprofit.com/posts/recipe-part2/”。对我来说听起来不错,但复杂,但很好。在这个相关论点上,我找不到其他参考文献。
问题:我可以考虑使用其他哲学来创建这种用户定义错误的专有处理/收集?一些书籍或文章?
我的决定将对如何设计和编写我的代码产生重大影响(将问题分解为多个函数,生成一个以序列函数运行的“马达”,或者根据结果以不同的方式组合,然后在哪里检查错误) /警告,如何存储错误和警告消息以了解正在发生的情况或产生“错误/警告”并导致“通过哪个功能”引起的错误。)
非常感谢。
答案 0 :(得分:1)
F#的方法是尽可能地将错误编码为类型。最简单的示例是一个选项类型,如果操作失败而成功则返回None
,您将返回Some value
。令人惊讶的是,这通常就足够了!如果不是,那么您可以在不同的联合中对不同类型的错误和成功“状态”进行编码,例如
[<Measure>]
type psi
type VesselPressureResult =
| PressureOk
| WarningApproachingLimit
| ErrorOverLimitBy of int<psi>
,然后您将使用模式匹配来“决定”每种情况下的操作。如果您需要添加更多变体,例如ErrorTooLow
,然后将其添加到DU,然后编译器将“告诉”您所有需要修复逻辑的地方。
这里是详细信息的理想来源:https://fsharpforfunandprofit.com/series/designing-with-types.html