我已经读了一下,试图找出何时适当地使用断言和例外,但仍然有一些我错过了大图。可能我只是需要更多的经验,所以我想带一些简单的例子来更好地理解我应该在什么情况下使用什么。断言和例外的适当使用
例1:让我们从一个无效值的经典情况开始。例如,我有下面的类,在这两个领域必须为正:
class Rectangle{
private int height;
private int length;
public int Height{
get => height;
set{
//avoid to put negative heights
}
}
//same thing for length
}
让我此话,我不是在谈论如何在这个例子中处理用户输入,因为我可以做一个简单的控制流程。虽然,我面临的想法是,在别的地方可能会出现一些意想不到的错误,我希望能够检测到这个错误,因为我不想要一个带有invald值的对象。所以我可以:
- 使用
Debug.Assert
并停止程序,如果发生这种情况,以便我可以纠正可能出现的错误。 - 抛出一个
ArgumentOutOfRangeException
基本上做同样的事情?这感觉不对,所以我应该使用它,只有当我知道我要在某个地方处理它时。虽然,如果我知道在哪里处理异常,我不应该解决它存在的问题吗?或者它可能意味着可能发生的事情,但你不能直接在代码中控制,就像用户输入(可以处理,没有例外,但也许别的东西不能)或加载数据?
问题:我是否明白断言和例外的含义是正确的?另外,请举例说明处理例外情况是否有用(因为是发生前无法控制的情况)?除了我提到的情况之外,我无法弄清楚还有什么可以发生,但我显然还是缺乏经验。
为了扩展我的问题:我可以想到为什么会抛出异常的各种原因,比如NullReferenceException
,IndexOutOfBoundsException
,IO异常如DirectoryNotFoundException
或FileNotFoundException
等等。虽然我无法弄清楚在哪些情况下处理除了简单地停止程序(在这种情况下,不应该使用断言?)或给出简单的问题出现位置之外,它们变得有用。我知道即使这是有用的,例外也意味着将“错误”分类并给出如何解决它们的线索。虽然,是一个简单的消息,真的他们对有用吗? 这听起来很腥,所以我会坚持“我从来没有面对过适当的情况,因为经验”的口头禅。
示例2:现在让我们来谈谈用户输入,使用第一个示例。正如我所预料的那样,我不会使用异常来检查值是否为正值,因为这是一个简单的控制流程。但是如果用户输入一个字母会发生什么?我是否应该在这里处理例外情况(可能是简单的ArgumentException
)并在catch
块中给出消息?或者也可以通过控制流程避免(检查输入是否为int
或类似的东西)?
感谢任何会清除我心有余悸的人。
没有一个正确的答案,它完全取决于你有支持系统来处理你的代码的客户端程序员错误,不知道为什么。用户输入无效数据并不例外。 –
我知道高度依赖于情况,我只是想弄清楚会出现什么样的情况。此外,坚持这个简单的例子,相反,如果我的意思是验证值只是为了检测代码中的错误,我应该使用'Debug.Assert'。如果我打算实施保存/加载数据,并且加载文件中的某些内容可能会失败,我可以捕获它并使用“损坏的数据”消息停止该程序。这种推理是正确的还是我没有达到断言和/或例外的目的? – Harnak
其不完整的问题。通过鼓励(或迫使)他们输入正确的数据来处理用户。停止程序时,它可能只是帮助用户似乎不必要 – ferday