如何处理catch块中的exception?
我试图找到处理exception的理想方法。 我用Google搜索并读取我应该在catch
块中放置try
catch
以处理但是如果嵌套块本身发生任何exception会怎样。
try { int a = 10; int b = 0; int c = a / b; Console.WriteLine(c); Console.ReadKey(); } catch (Exception ex) { int a = 10; int b = 0; int c = a / b; Console.WriteLine(ex.Message.ToString()); Console.ReadKey(); } finally { Console.WriteLine("Some Exception"); }
在谷歌搜索我读到它应该装饰如下:
- 如果Catch块本身发生exception,那么如何在C#中处理它?
- 如果Catch块本身发生exception,那么如何在C#中处理它?
-
如果在C#中的Catch块中发生exception会发生什么。 在这种情况下,调用者结果也是如此
try { int a = 10; int b = 0; int c = a / b; Console.WriteLine(c); Console.ReadKey(); } catch (Exception ex) { try { } catch(Exception innerEx) { // What if exception here also occurs. } } finally { Console.WriteLine("Some Exception"); }
如果我这样做,那么它将陷入无限的
try-catch
块。
我认为有一些更好或正确的方法来处理这种情况。
首先,您需要知道尝试,捕获和最终工作的内容让我们开始:
-
尝试:在这个块中,我们可以编写有可能抛出一些错误的代码(更好的做法是在其中编写代码部分。)
-
Catch:它负责显示错误以及如果出现错误该怎么办(比如你的代码10/0抛出错误,可以在本节中处理。)
-
最后:本部分编写的代码将执行任何错误天气如何进入。
现在,对于您的查询,最好在最后使用If … else,并将代码放入该部分将保存在try catch块中。
例如:
bool flagCatch=false; try { int a = 10; int b = 0; int c = a / b; Console.WriteLine(c); Console.ReadKey(); } catch (Exception ex) { //Error handling flagCatch=true; Console.WriteLine(ex.Message.ToString()); Console.ReadKey(); } finally { try { if(flagCatch) { //Code } else { //Code when error not comes } } catch(Exception err) { //Error handling } }
我认为有一些更好或正确的方法来处理这种情况。
在这方面没有意图,但简单地说,不要让exception发生在一开始。
try...catch
是一种语言结构,可以确保您处理边缘情况或首先没有缓解和设计的错误,因此它是特殊代码的原因。
在你的代码中,你只是因为除以0而抛出错误,但在现实世界中,你想要处理它并提醒用户(或开发人员,服务器或其他),然后处理实际特殊代码,例如:
static void PrintError() { Console.WriteLine("You must enter a valid number between {0} and {1}, excluding 0", int.MaxValue, int.MinValue); } static void Main(string[] args) { try { int a = 10; int b = 0; PrintError(); // Tell user to enter valid numbers while (b == 0) { string user_input = Console.ReadLine(); if (int.TryParse(user_input, out b)) { // is it an actual number? if (b == 0) { // no 0's remember user!?? PrintError(); } else { // ok, everything checks out, so do what the system can actually handle without throwing an error Console.WriteLine("a/b = {0}", (a / b)); } } else { PrintError(); } } } catch (Exception ex) { Console.WriteLine("Something exceptional happened: {0}", ex); } }
这个例子可以进一步简化,但它certificate除了实际上exception的东西(即内存不足或其他系统错误)之外,没有实际可能发生的exception。
在具有多个类的较大代码库的情况下,exception处理程序和终结器将是您可以清除在代码的其他区域中获取的资源的位置,例如关闭套接字或文件句柄以确保数据不会丢失。
如果exception处理程序中发生错误(可能并且确实发生了这种情况),您需要了解这一点,并了解在这种情况下可能发生的情况。
如果C#应用程序使用.NET框架,exception中抛出的exception只会导致应用程序崩溃,内部exception堆栈跟踪(相对于可能与实际exception更相关的“外部”exception),如果不是处理。
有很多“错误”的方法来处理exception(比如根本不处理exception),但鉴于exception的可变性,并没有真正的“正确”方式。
希望能有所帮助。
我会赞同Tieson T.的评论。 从我的角度来看,这是一个设计问题。
我还可以使用if
语句构建一个示例 – >如果出错,我执行故障处理 – >如果故障处理出错,我执行故障处理,如果故障处理出错……
为了使代码更具可读性,您可以尝试在方法中“隐藏” try-catch
块,如:
static void PerformInTryCatch(Action action, T obj) where TException : Exception { try { action(obj); } catch (TException exception) { // Perform some logging } }
希望有所帮助。
正确的是,catch块的内容也应该由try-catch块保护。 但是,当您没有办法处理和解决错误时,剩下的就是将错误抛出堆栈以结束该处理线,通常记录发生的事件并向用户显示错误消息。
一个问题是catch中发生的错误意味着你现在有两个例外,只有一个throw机制。 如果抛出并记录内部exception,则会丢失导致外部exception的问题,反之亦然。
一个简单的解决方案是使用AggregateException
:
try { MyCode(); } catch (Exception ex) { try { HandleMyCodeException(); } catch (Exception handlerEx) { throw new System.AggregateException(ex, handlerEx); } //throw; }
这样,如果你的处理程序,catch中的代码,可以解决程序可以继续的问题,但是如果处理程序有问题,那么原始和次要exception都可以抛出一个。 如果你的处理程序正在进行清理,那么取消注释throw;
语句将原始exception传递给堆栈不变。
如果我们可以将handlerEx
的内部exception设置为ex
,那么将更容易,但InnerException属性是只读的。