6
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 块的第一行没有给出任何编译错误 -

捕捉(数据异常)

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

捕获(数据异常 d)

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

4

3 回答 3

6

C# 5.0 规范的第 8.10 节中,您会找到以下的语法定义try/catch(对于格式化表示歉意):

catch-clauses:
    specific-catch-clauses general-catch-clause opt
    specific-catch-clauses opt   general-catch-clause
specific-catch-clauses:
    specific-catch-clause
    specific-catch-clauses specific-catch-clause
specific-catch -clause:
    catch    (    类类型标识符opt    )    块
general-catch-clause:
    catch    块

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

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

于 2015-09-15T02:14:22.543 回答
2

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

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

例如,我编写了一个自定义异常并重写Message以格式化我的消息。with catch (ExceptionType), 你不能访问 message.with catch (ExceptionType d), 你可以访问 withd.Message

于 2015-09-15T02:07:31.667 回答
2

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

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

于 2015-09-15T02:11:22.973 回答