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

时间:2015-09-15 01:58:32

标签: c# catch-block

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)

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

catch(DataException d)

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

3 个答案:

答案 0 :(得分:5)

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

  

追赶子句:
  特异性捕获子句一般追赶子句<子>选择
  specific-catch-clauses opt general-catch-clause
  特定追赶条款:
  特定追赶条款
  特定追赶条款特定追赶条款
  特定追赶条款:
  catch (类型标识符<子>选择 )
  一般追赶条款:
  catch

因此,根据规范,您可以看到catch { }catch (Exception) { }catch (Exception ex) { }都有效。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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