2013-04-08 48 views
0

我知道,我们可以使用try-catch块来处理异常。但是我对Try-Catch的用法有些怀疑。 是什么异常处理Try-Catch块区别

try 
    { 
     //Some code 
    } 
    catch 
    { 

    } 

try 
    { 
    //Some code 
    } 
    catch(Exception) 
    { 

    } 

try 
    { 
    //Some code 
    } 
    catch(Exception oops) 
    { 

    } 

之间的区别在我的计划,我需要捕获所有异常,我不希望记录他们。从上面提到的Try-Catch块,应该使用哪个?

+0

最后一个,我宁愿。虽然第一和最后两个工作。不知道中间;我从未在任何地方见过。 – Zyerah 2013-04-08 08:29:11

+3

[try/catch/throw和try/catch(e)/ throw e之间的差异的可能重复(http://stackoverflow.com/questions/1697216/the-difference-between-try-catch-throw-and -try-catche-throw -e) – 2013-04-08 08:29:13

+0

我希望你不打算只是'吞下'例外...... – 2013-04-08 08:48:34

回答

1

使用不带参数的catch在框架2.0中不再有用,因为所有非托管异常都包含在托管异常中。在此之前,您可以使用它来捕获非托管代码抛出的异常。

您可以指定例外的只是类型,如果你不希望使用从它的任何信息,但通常你会想它一个名称,以便您可以得到的信息:

try { 
    // some code 
} catch(Exception) { 
    // i don't care about any information in the Exception object, just the type 
} 

try { 
    // some code 
} catch(Exception ex) { 
    // use some information from the exception: 
    MessageBox.Show("Internal error", ex.Message); 
} 

你应该总是有一个异常类型是越具体越好,因为这可以更容易地处理异常。然后,您可以添加较少的特定类型来处理其他异常。例如:

try { 
    // some database code 
} catch(SqlException ex) { 
    // something in the database call went wrong 
} catch(Exception ex) { 
    // something else went wrong 
} 
1

到目前为止,您使用catch (Exception),第一个和第二个是相同的。你在这种情况下抓住了一切。当你想捕捉特定的异常像UnauthorizedAccessException,你必须使用第二个这样的:

try 
{ 
    //Some code 
} 
catch (UnauthorizedAccessException) 
{ 
    MessageBox.Show(oops.Message); 
} 

在第三种情况下,你可以通过可变oops使用异常。

例如:

try 
{ 
    //Some code 
} 
catch (Exception oops) 
{ 
    MessageBox.Show(oops.Message); 
} 

或与特定的例外:

try 
{ 
    //Some code 
} 
catch (UnauthorizedAccessException oops) 
{ 
    MessageBox.Show(oops.Message); 
} 
+1

第一和第二不是**总是**相同 – LukeHennerley 2013-04-08 08:31:25

+0

你能解释一下任何例子吗? – Andy 2013-04-08 08:34:58

+1

是的 - 如果您更改捕捉块中的异常类型,它将不会捕获所有异常。您倾向于在最佳代码实践中捕获特定的预期类型的​​例外情况。看到我的答案为例:) – LukeHennerley 2013-04-08 08:36:19

0

您应该使用最后一个,并以清洁的方式处理您的例外。

第一种方法是相同的,但是“饮食例外”,女巫是最糟糕的事情。

至少记录你的异常!

+0

说实话,他不应该使用**任何**。这是不好的设计,你应该只捕捉你打算处理的*特定的异常,通常不是一个好主意。 – James 2013-04-08 08:39:00

+0

我认为你是好人。如果有人来找你,问你“我想砍我的手臂,我该怎么做?”。你应该回答什么?是的,我认为@Kaizen不应该这样做,但问题不是“这是否是一个好主意”,所以......我们该怎么做?莫会做什么? – Thomas 2013-04-08 08:46:05

+0

你给出*技术*的答案,然后以大胆的文字说*你为什么*他们不应该。 – James 2013-04-08 10:09:15

0

它们几乎都是一样的(我假设第一个是写第二个的简写),与最后一个不同之处在于您将异常对象放入一个变量中,以便您可以在catch中使用它。

通常当我看到这样的代码时,我倾向于担心,因为它通常是而不是是一个好主意,因为您可以屏蔽更大的应用程序问题。经验法则 - 处理你所能做的事情,让其他所有事情都泡起来。

0

你的第一个和第二个例子是一样的。他们都会发现任何异常,但没有任何关于例外的信息。第三个异常将异常存储在oops中,然后可以使用该异常获取有关异常的更多信息。

1

通用尝试捕捉,这将捕获任何类型的异常

try 
{ 
    //Some code 
} 
catch 
{ 

} 

这将赶上您指定的特定类型的异常,你可以指定多个。

try 
{ 

} 
catch (UnauthorizedAccessException) 
{ 

} 

这将执行与上述相同的操作,但会为您提供一个可以访问异常属性的变量。

try 
{ 

} 
catch (UnauthorizedAccessException ex) 
{ 

} 
0

第三个是最好的...

您可以捕捉任何一种特定的异常,这将是准确的...这有助于确定确切的异常,并容易让我们改正以及

对于例如:一个可以捕捉DivisionByZeroException,TargetInvocationException,ArrayOutOfBoundException等..

0

我认为它具有相同的功能 - 要追查错误设定/或没有什么地方拿错,

使用的try-catch这样

> try { 

//some codes 
} 

catch 
{ 
//anything 
//e.g.: 
MessageBox.Show("Something is wrong!"); 
} 

这告诉那有什么不对,但并没有表现出详细的报告。 (隐藏一些错误,聪明的办法是不要放任何东西在catch {} XD,但这不建议这样做)

接下来就是显示错误

try 
{ 
//some codes 
} 

catch (Exception ex) 
{ 
MessageBox.Show(ex.ToString()); 
} 

希望的详细报告这有助于! :D