c# - 我究竟应该如何使用异常?

标签 c# .net

刚接触 C#,我想知道我应该如何使用异常?我的意思是,不是机械水平,而是良好实践水平。

例如,我将使用我的计算器来标记化并转换为 RPN 并解决 RPN 中给出的问题。

在标记化步骤中,有各种无效输入,比如“7.7.8”或“^&##”,我应该为未知符号和无效数字设置单独的异常(exception)吗?说只有一个异常然后其中包含错误类型的方法提供给用户是错误的吗?

我真的找不到太多关于这种事情的资料,所以我想我应该问问比我更有经验的人。

-----编辑:

感谢大家的精彩回复,今天我学到了很多关于我的问题的知识 :),甚至更多。

最佳答案

从前置条件和后置条件的角度考虑您的词法分析器。这里有两种设计词法分析器的方法:

  1. 词法分析器是一种接收格式正确的输入字符串并输出词法分析的设备。输入字符串必须格式正确;如果不是,则词法分析器失败并出现异常。

  2. 词法分析器是一种获取输入字符串并生成词法分析的设备。词法分析包括错误条件的识别和分析。

您是否知道您要传入的字符串是正确的,并且您希望在它不正确的特殊情况下异常(exception)?还是您不知道该字符串是正确的,并且您希望词法分析器确定这一点?

在前一种情况下,抛出异常。在后一种情况下,将错误分析作为词法分析器输出的一部分。

基本上我要说的是 do not produce vexing exceptions .恼人的异常非常恼人。如果您的代码的调用者调用它来确定字符串是否正确,那么他们不希望以异常形式出现该信息,他们希望以表示的数据对象形式出现错误分析。如果代码的目的是产生错误分析,那么产生这样的分析作为方法的正常操作。不要将分析嵌入到异常中并让某人捕获异常以获取它。

关于c# - 我究竟应该如何使用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344274/

相关文章:

c# - 三角数组的最佳数据存储类型是什么?

c# - 从 2.0 MongoDb c# 驱动程序获取结果

c# - 防止任务在特定线程上运行

c# - Akavache 的 GetObject<T> 在等待时挂起。知道这里出了什么问题吗?

c# - 在 ToDictionary 之前执行 ToList() 是否更好?

javascript - 禁用输入类型为 =“time” 的 webkit 输入掩码?

.net - 是否有支持 ESE 的 ORM?

.net - 即使在 TableAdapter.Update 运行后立即,DataSet.HasChanges 也为 true

c# - 关键值对的简明动态列表

c# - 如何使用 LINQ 查找特定属性的副本?