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)
有人可以解释上述行为吗?
答案 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块。根据您编写的方式,您将不会有任何存储异常的变量供您稍后访问。
通常,单行代码(甚至不是行块)都可以抛出多种类型的异常。您希望对每种异常进行不同的处理。