7

我有一段代码

//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
}                               }                               }

所有三个代码之间有什么区别
P.S. 我是新手,C#JavaObjective-C担心这种语法会引发错误

4

7 回答 7

10

代码 1

它在对象中捕获异常,e以后可以用于异常处理。例如,您可以使用e.Message或记录 Message 属性或查看堆栈跟踪e.StackTrace

代码 2

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

catch(InvalidCastException)

然后所有的InvalidCastException将在没有异常对象的块中处理

代码 3

您正在捕获所有类型的异常,无论它们的类型如何,这类似于您的代码 2 与基类Exception

尝试捕捉 - MSDN

尽管可以在不使用参数的情况下使用 catch 子句来捕获任何类型的异常,但不建议使用这种用法。通常,您应该只捕获那些您知道如何从中恢复的异常。

如果您在捕获基本异常之前捕获特定异常,它总是会更好。就像是。

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

尝试 - 捕捉 - MSDN

在同一个 try-catch 语句中可以使用多个特定的 catch 子句。在这种情况下,catch 子句的顺序很重要,因为 catch 子句是按顺序检查的。在不太具体的异常之前捕获更具体的异常。如果您对 catch 块进行排序以使后面的块永远无法到达,编译器会产生错误。

于 2013-01-04T10:56:01.453 回答
3

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

代码 2 - 您希望在发生特定异常时执行特定代码,但您无意与异常对象进行实际交互。应该几乎总是throw;在最后有一个声明,以便其他在堆栈中关心catch它的人可以做到。

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

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

于 2013-01-04T10:52:39.480 回答
2

在这里,如果您想使用变量“e”来获取异常消息、行或类型。

//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   
}
于 2013-01-04T10:52:55.897 回答
1

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

一般来说,最常用的方法是第一种方法,如果你想分别处理不同类型的异常,你可以有多个 catch 块,从最专业的顶部开始,把你写的那个放在底部,这样所有的异常都还没有处理将在通用 catch 块中结束。

于 2013-01-04T10:50:42.173 回答
1

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

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

当您为异常指定变量时,例如catch (Exception e)您将可以通过e.Property或仅e.ToString()访问完整消息来访问堆栈跟踪(和其他异常信息)。这也是throw捕获异常时的最佳实践(好吧,除非您想在此级别抑制它并且不允许您的调用代码看到异常),因此它会冒泡并保留堆栈跟踪:

catch (Exception e)
{
    // do something with e

    throw;
}
于 2013-01-04T10:50:49.543 回答
1

代码 1 捕获每个异常(在您的情况下!)并声明它,因此您可以稍后将其用于错误消息。

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# 中异常的更多信息。

于 2013-01-04T10:56:49.020 回答
1

差异:

  1. 声明异常参数 ex允许您访问异常对象,以便查看和使用其属性、字段、方法等。这个“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.");
}
...
于 2013-01-04T11:18:19.777 回答