[英]How to handle exception in catch block?
我正在嘗試找到處理異常的理想方法。 我用谷歌搜索並閱讀了我也應該將try
catch
放入catch
塊中以進行處理,但是如果嵌套塊本身發生任何異常怎么辦。
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");
}
谷歌搜索時,我讀到它應該裝飾如下:
如果C#中的Catch塊中發生異常,會發生什么情況。 在這種情況下,呼叫者也會得到什么結果
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
塊中。
我認為會有一些更好或正確的方法來處理這種情況。
我認為會有一些更好或正確的方法來處理這種情況。
這樣做並不是故意的,而是簡單地,不允許一開始就發生異常。
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);
}
}
該示例可以進一步簡化,但是它演示了除了真正例外的情況(例如,內存不足錯誤或某些其他系統錯誤)之外,沒有實際發生的異常。
在具有多個類的較大代碼庫的情況下,可以使用異常處理程序和終結器清除在代碼其他區域中獲得的資源,例如關閉套接字或文件句柄以確保數據不會丟失。
如果異常處理程序中發生錯誤(可能發生並確實發生的事情),則您需要意識到這一點並知道在這種情況下可能會發生什么。
如果C#應用程序使用.NET框架,則在異常中引發的異常只會導致應用程序因內部異常堆棧跟蹤而崩潰(與可能與實際異常更相關的“外部”異常)處理。
有很多“錯誤”的方式來處理異常(例如根本不處理它們),但是鑒於異常的可變性,實際上並沒有真正的“正確”方式。
希望能對您有所幫助。
首先,您需要知道什么可以嘗試,捕獲並最終起作用,讓我們開始吧:
嘗試:在此塊中,我們可以編寫可能引發一些錯誤的代碼(更好的做法是在其中編寫代碼。)
捕獲:負責顯示錯誤以及如果出現錯誤,該怎么辦(就像您的代碼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
}
}
我同意蒂森·T的評論。 從我的角度來看,這是一個設計問題。
我也可以用if
語句->如果出錯了,執行故障處理->如果失敗處理出錯,則執行故障處理,如果失敗處理出錯....
為了使代碼更具可讀性,您可以嘗試使用以下方法“隱藏” try-catch
塊:
static void PerformInTryCatch<T, TException>(Action<T> action, T obj) where TException : Exception
{
try
{
action(obj);
}
catch (TException exception)
{
// Perform some logging
}
}
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.