C# catch(DataException) - 没有定义变量

C# catch(DataException) - no variable defined

static void Main(string[] args)
{
    try
    {
        Console.WriteLine("No Error");
    }
    catch (DataException) /*why no compilation error in this line?*/
    {
        Console.WriteLine("Error....");
    }
    Console.ReadKey();
}

代码正在编译,没有任何错误。我不明白为什么 catch 块的第一行没有给出任何编译错误 -

捕获(DataException)

catch 块的 DataException 参数是一个 class,它旁边应该有一个变量,例如 -

捕获(DataException d)

有人可以解释以上行为吗?

因为catch不是方法。您不需要类型旁边的参数。没有参数,只有类型,该特定类型的异常将使用该 catch 块处理,但细节将被忽略。

catch (DataException)让您知道异常的类型,但您无法获取详细信息。

例如,我编写了一个自定义异常并重写了 Message 来格式化我的消息。使用 catch (ExceptionType),您无法访问 message.with catch (ExceptionType d),您可以使用 d.Message

访问

您当前的编写方式意味着您告诉编译器当抛出类型为 DataException 的异常时,需要处理此 catch 块。按照您编写它的方式,您将不会有任何存储异常的变量供您以后访问。

通常一行代码(甚至不是一行代码)可以抛出多种类型的异常。您希望对每种异常进行不同的处理。

C# 5.0 spec 的第 8.10 节中,您将找到 try/catch 的语法定义(对格式表示歉意):

catch-clauses:
    specific-catch-clauses       general-catch-clauseopt
    specific-catch-clausesopt   general-catch-clause
specific-catch-clauses:
    specific-catch-clause
    specific-catch-clauses    specific-catch-clause
specific-catch-clause:
    catch    (    class-type    identifieropt    )    block
general-catch-clause:
    catch    block

所以你可以看到 catch { }catch (Exception) { }catch (Exception ex) { } 根据规范都是有效的。

如果您没有在 catch 块中指定可选标识符,那么您将无法访问任何异常详细信息 - 但有时您不需要,所以最好不要声明您不需要的变量'打算访问。