在此处添加 try-catch 构造以捕获“ArgumentNullException”
Posted
技术标签:
【中文标题】在此处添加 try-catch 构造以捕获“ArgumentNullException”【英文标题】:Add a try-catch construction here to catch "ArgumentNullException" 【发布时间】:2021-04-10 03:04:51 【问题描述】:如果抛出“ArgumentNullException”并将“exceptionMessage”参数设置为异常消息,该方法应返回true;否则该方法应返回 false。
public static bool CatchArgumentNullException(object obj, out string exceptionMessage)
exceptionMessage = string.Empty;
try
if (obj is null)
throw new ArgumentNullException(exceptionMessage);
catch (Exception)
return false;
该方法返回 false。为什么?如何返回true?
【问题讨论】:
您可能想阅读 Eric Lippert 的 classification of exceptions:“愚蠢的异常......您不应该捕获它们;这样做会在您的代码中隐藏一个错误。相反,您应该编写代码以便异常不可能一开始就发生,因此不需要被捕获。” ...因为你只有return false;
?这整个事情有点不稳定,你想做什么?这是某种编程练习吗?
您捕获了异常并且不对其执行任何操作,因此代码超出了您的 tye/catch 并返回 false。
我有一个特定的任务要破例。
@OlivierRogier:不可能,这几乎不是一个好的设计。在某些特殊情况下,它可能是合理的,例如从深度通话中签署取消协议,但与简单的 if
语句相比,它的成本很高。
【参考方案1】:
代码已更正
public static bool CatchArgumentNullException(object obj, out string exceptionMessage)
exceptionMessage = string.Empty;
try
if ( obj is null )
throw new ArgumentNullException();
catch ( Exception ex )
exceptionMessage = ex.Message;
return true;
return false;
测试
object obj1 = null;
object obj2 = new object();
if ( CatchArgumentNullException(obj1, out var msg1) )
Console.WriteLine("obj1: " + msg1);
else
Console.WriteLine("obj1 is not null");
if ( CatchArgumentNullException(obj2, out var msg2) )
Console.WriteLine("obj2: " + msg2);
else
Console.WriteLine("obj2 is not null");
输出
obj1: La valeur ne peut pas être null. // The value can't be null.
obj2 is not null
改进
public static bool IsArgumentNull(object instance, string name, out string errorMessage)
errorMessage= string.Empty;
try
if ( instance is null )
throw new ArgumentNullException(name);
catch ( Exception ex )
errorMessage= ex.Message;
return true;
return false;
object obj1 = null;
object obj2 = new object();
if ( IsArgumentNull(obj1, nameof(obj1), out var msg1) )
Console.WriteLine(msg1);
else
Console.WriteLine("obj1 is not null");
if ( IsArgumentNull(obj2, nameof(obj2), out var msg2) )
Console.WriteLine(msg2);
else
Console.WriteLine("obj2 is not null");
The value can't be null.
Name of the parameter : obj1
obj2 is not null
现在,如果对象为空,并且我们有一个标准的本地化系统消息,包括变量名,这是一个返回 true 的方法。
【讨论】:
【参考方案2】:-
需要在catch语句中添加return
如果您只想捕获 ArgumentNullException 或所有类型的异常,您可以更改如下代码。您当前的 catch 语句适用于所有类型的异常。
public static bool CatchArgumentNullException(object obj, out string exceptionMessage)
exceptionMessage = string.Empty;
try
if (obj is null)
throw new ArgumentNullException(exceptionMessage);
catch (ArgumentNullException ex)
return true;
catch (Exception e)
return true;
return false;
【讨论】:
@OlivierRogier 这是用户提交的问题的一部分。问题在我回答后被编辑。以上是关于在此处添加 try-catch 构造以捕获“ArgumentNullException”的主要内容,如果未能解决你的问题,请参考以下文章