C# C中的Catch和Catch(异常e)#
我想这三部分代码之间没有区别,不是吗C# C中的Catch和Catch(异常e)#,c#,.net,C#,.net,我想这三部分代码之间没有区别,不是吗 try { // ............. } catch { // ............. } 及 及 然而,我几乎知道什么时候应该使用第一个和什么时候-第二个。但我想让你谈谈你的想法。视情况而定。我不知道前两个有什么区别 如果要在catch块中使用异常,即获取堆栈跟踪或其他信息,则必须使用最后一个异常,以便有一个要引用的对象 如果您只是抛出异常供其他人处理,则不需要它。
try
{
// .............
}
catch
{
// .............
}
及
及
然而,我几乎知道什么时候应该使用第一个和什么时候-第二个。但我想让你谈谈你的想法。视情况而定。我不知道前两个有什么区别 如果要在catch块中使用异常,即获取堆栈跟踪或其他信息,则必须使用最后一个异常,以便有一个要引用的对象
如果您只是抛出异常供其他人处理,则不需要它。第一个异常也将捕获抛出的非异常对象。
() 如果您没有实际使用exception变量,那么第二个将不会给出编译器警告 只有当您确实需要检查抛出的异常(例如,记录它)时,才应该使用第三个异常。这些代码位有很大的不同 第一种方法不允许您从发生的异常中获取任何信息。它会捕捉到任何东西,但你不会知道捕捉到了什么 第二种方法不允许您执行任何操作,但至少允许您指定什么样的异常。在您的示例中,由于您已经指示了
异常
,它将捕获从异常
派生的所有内容。但是它可以被改变来微调被捕获的东西——但仍然允许你对它什么也不做
第三种情况允许您实际访问异常并从中获取信息。第三种情况实际上是: 当try块中的某一行发生异常时,将创建相应异常的对象。包含
(异常e)
的catch块实际上有一个异常
类变量e
作为其参数。然后将异常对象的引用复制到此引用变量。现在,您可以根据需要使用此e变量来标识引发的异常类型,例如e。message()
提供了与异常相关的描述
第一种和第二种情况已经用Slaks很好地解释了什么是“任何东西”?@AlexMaslakov我的意思是,字面上的任何东西。这就是为什么我用这个词。如果一些不符合cls的代码设法抛出非异常,它甚至会捕获非异常。从.NET 2.0开始,第一个和第二个示例是相同的。非CLS兼容的异常现在由RuntimeWrappedException包装,它派生自Exception。
try
{
// .............
}
catch(Exception)
{
// .............
}
try
{
// .............
}
catch(Exception e)
{
// .............
}