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 块中指定可选标识符,那么您将无法访问任何异常详细信息 - 但有时您不需要,所以最好不要声明您不需要的变量'打算访问。
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 块中指定可选标识符,那么您将无法访问任何异常详细信息 - 但有时您不需要,所以最好不要声明您不需要的变量'打算访问。