无参数捕获与其他捕获的区别

本文关键字:区别 其他 参数 | 更新日期: 2023-09-27 17:50:35

我有这段代码

//Code 1                        Code 2                          Code 3
try                             try                             try
{                               {                               {
    //Exp occur                     //Exp occur                     //Exp occur 
}                               }                               }
catch (Exception e)             catch (Exception)               catch
{                               {                               {
    //Handle exp                    //Handle exp                    //Handle exp
}                               }                               }

这三种代码的区别是什么
注:我是 C# 的新手,就 Java Objective-C 而言,此语法抛出错误

无参数捕获与其他捕获的区别

代码1

它在对象e中捕获异常,该对象可以稍后用于异常处理。例如,您可以使用e.Messagee.StackTrace

记录Message属性或查看堆栈跟踪。代码2

您正在捕获基类型Exception的所有异常,但由于您没有任何与之相关的对象,因此您只能抛出该异常,以便它可以弹出,或者您可以忽略该异常。如果代码中有:

catch(InvalidCastException)

那么所有的InvalidCastException将在块中处理,没有异常对象

代码

3

你捕获所有类型的异常,不管它们的类型,这类似于你的代码2与基类Exception

try-catch - MSDN

尽管可以使用不带参数的catch子句来捕获任何异常类型,不建议这样使用。一般来说,你应该只捕获那些你知道如何恢复的异常。

如果在捕获基本异常之前捕获特定异常总是更好。喜欢的东西。

try
{
}
catch(InvalidCastException ex)
{
}
catch(Exception ex)
{
}

try - catch - MSDN

可以在同一个语句中使用多个特定的catch子句try - catch语句。在本例中,catch子句的顺序是重要是因为catch子句是按顺序检查的。抓住了更具体的异常在不太具体的异常之前。编译器如果对捕获块进行排序以使后面的块

代码1 -相当正常的捕获,希望不需要解释

代码2 -当一个特定的异常发生时,你想执行一段特定的代码,但是你不打算与异常对象进行实际的交互。应该总是在语句的末尾有一个throw;语句,这样其他更高层的人就可以catch它了。

代码3 -您希望代码执行任何异常(*)(除了由同一try的早期catch子句捕获的任何异常)。同样,应该几乎总是包含throw;,以便高级代码可以catch并实际处理异常。

在某些级别(可能只是在顶层,在您所处的任何环境的未处理异常处理程序中),某些应该检查异常对象并可能记录它(如果可能的话)。

在这里,如果您想使用变量'e'来获取Exception消息,Line或type

//Code 1                       
try                            
{                              
 //Exp occur                
}                              
catch (Exception e)            
{                              
 //Handle exp               
}

下面的代码用于获取特定类型的异常,而不处理异常变量。

//Code 2
try                            
{                              
  //Exp occur                
}                              
catch (Exception)
{                              
 //Handle exp           
}

下面的代码捕获所有类型的异常。

//Code 3
try
{
 //Exp occur    
}     
catch 
{                  
 //Handle exp   
}

如果您计划实际使用异常对象,将其属性记录到日志文件中,或显示消息框,或抛出另一种异常并将当前异常传递给其构造函数,那么您必须使用三个中的第一个(最左边的一个)。

一般来说,最常用的方法是第一个,无论如何,如果你想单独处理不同类型的异常,你可以有多个catch块,从最特化的开始在顶部,把你写的一个在底部,这样所有尚未处理的异常将在通用的catch块中结束。

无。它们都捕获每一个可能发生的异常(通过捕获基类型Exception或任何)。这通常是不受欢迎的,这是有充分理由的。您应该按照您期望的顺序捕获特定的异常,然后,如果您确实想捕获所有异常,则在最后捕获Exception

try
{
}
catch (MyCustomException)
{
    // do something for your custom exception
}
catch (Exception)
{
    // do something for everything else
}

当您为异常(如catch (Exception e))指定变量时,您将可以通过e.Propertye.ToString()访问堆栈跟踪(和其他异常信息)以获取完整消息。最好的做法是在捕获异常时将异常throw(好吧,除非您想在这个级别上抑制它,并且不允许调用代码看到异常),这样它就会冒出来,并保留堆栈跟踪:

catch (Exception e)
{
    // do something with e
    throw;
}

代码1捕获每个异常(在您的情况下!)并声明它,因此您可以稍后使用它,例如Error-Messages。

MessageBox.Show(e.Message);

代码2也捕获每个异常(在你的例子中!),但是你不能使用它,因为它没有被声明。

这两个方法不是为此而设计的,它们是用来捕获特定的或定制的异常的。

    try
    {
     //mycode
    }catch(MyException myExc)
    {   
    //TODO HERE  
    Console.Write(myExc.Message);  
    }

第三个捕获所有异常。因为没有定义

看看:http://msdn.microsoft.com/de-de/library/0yd65esw%28v=vs.80%29.aspx

来了解更多关于c#中的异常。

差异

  1. 声明异常参数ex允许您访问异常对象,以便查看和使用其属性,字段,方法等。

  2. 声明不带参数ex的异常类型允许您为不同类型的异常分离几个"捕获"区域。它是无用的,在功能上等同于您在这里定义的代码示例3,但是如果您需要根据异常的类型执行不同的操作,并且您不需要访问异常对象(您只需要知道异常的类型),那么这就是您的方法。

  3. Untyped Catch Exception Handler允许您为任何可能被抛出的异常添加回退,无论其类型如何。但是,由于它没有参数化,因此您将无法访问Exception对象的属性或方法。因此,代码样例2代码样例3是等价的。

的例子:

try{ // code that throws exception }
catch(TypeException ex) 
{ 
    // code to handle exceptions of type TypeException
    // I can access ex parameter, for example to show its Message property
    MessageBox.Show(ex.Message);
}
catch(OtherTypeException) 
{ 
    // code to handle exceptions of type OtherTypeException 
    // I cannot access the ex parameter since it is not declared, but I know
    // the exact type of the exception
    MessageBox.Show("There was an exception of Other Type");
}
catch
{
    // code to handle any other exception
    // this is functionally equivalent to catch(Exception) since all typed exceptions
    // inherit from the base type Exception
    MessageBox.Show("An unknown exception has been thrown.");
}
...