对于null参数,抛出异常与检查null

时间:2010-03-26 21:53:47

标签: c# .net exception ado.net

如果参数为null(例如if(a为null)抛出新的ArgumentNullException()),哪些因素决定抛出异常,而不是事先检查参数是否为null。

我不明白为什么应该抛出异常而不是首先检查null?抛出异常方法有什么好处?

这适用于C#/。NET

由于

5 个答案:

答案 0 :(得分:8)

通常,在传递参数时抛出ArgumentNullException,其值为null但应该“永远”为null。它是一个用于处理空值的特定ArgumentException。

通常情况下,如果你意识到你将得到null值作为args,你检查null并相应地计划你的方法的其余部分 - 通常创建记录(如果不存在),或者执行不同的子程序。如果存在有效参数,则运行。在这种情况下,我通常不使用ArgumentNullException,因为我计划将null作为有效输入。

我只使用ArgumentNullException,当我肯定某些东西在它到达时不应该为null,并且我想记下一个被定义为“无效”的参数。

答案 1 :(得分:5)

当参数为null时,您的方法可以执行以下三种操作之一。它可以抛出异常,它可以在不做任何事情的情况下返回,或者它可以做出假设并尝试继续。我假设您正在尝试在前两个选项之间进行选择。

由于调用方法总是可以在调用方法之前检查参数,因此可以防止传递无效值。无论您的方法如何处理无效值,都是如此。

当使用无效参数调用方法时,它应该通知调用者处理没有继续。您可以通过抛出异常或返回错误值来通知它。如果检查null并且不返回错误值,则调用方法将假定您的方法没有错误处理。

您希望调用方法如何处理您的方法不处理的情况?如果传递null是正常现象,并且应该可以通过调用方法轻松处理,则返回null参数的错误是可以接受的。在这种情况下,调用方法要么先检查参数,要么在选择之后返回值,直到写入调用方法的人为止。

如果传递null非常罕见,则抛出异常。调用方法可以通过在调用方法之前检查参数来阻止异常,如上所述。通过抛出异常,可以解开调用堆栈,而无需添加大量代码。

要点:
如果设置为null的参数是例程,并且应该编写调用方法来处理函数返回而不执行任何操作只返回错误值。如果一个null参数很少见,并且不能期望调用方法处理你的方法,那么什么都不会抛出异常,因此调用堆栈被解开。

答案 2 :(得分:3)

不要编写检查null参数的代码,然后什么也不做。隐藏客户端代码中的错误是非常错误的,当您的API未正确使用时,您希望尽可能提供帮助。

ArgumentNullException 非常有帮助。

答案 3 :(得分:1)

作为方法编写者,您必须决定是否可以合理推断 null调用者的意思。如果可以的话,采取行动。如果你不能,请抛出ArgumentNullException通知来电者他们给你一个你不能使用的价值。

这是防御性编程 - 尽可能早地和尽可能地消亡,而不是试图与部分有效的状态一起跛行,这会变得更加微妙(并且更难修复)错误。

答案 4 :(得分:0)

这是关于决定你方法的合同是什么。如果您希望合同是调用者不能传递null,那么必须在您获得例外时抛出异常。不要相信来电者永远不会犯这个错误! OTOH,如果你希望合同在那个论证中不那么严格(无论那意味着什么;要么没有做任何优雅或其他某种行为),那么异常显然是错误的。

无论你做什么,记录。在给你的方法扔东西之前给穷人打电话给他一个机会......