在此处添加 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”的主要内容,如果未能解决你的问题,请参考以下文章

错误检测------try-catch语句 From 《高程3》

C#中关于try-catch的异常捕获问题

C#中关于try-catch的异常捕获问题

在获取期间无法在 try-catch 中捕获 403

try-catch默认捕获所有异常

如何使用 try-catch 捕获浮点错误?