文章編號: 816157 - 上次校閱: 2008年7月16日 - 版次: 3.1

如何使用結構化的例外處理在 Visual C#.NET 和 Visual C# 2005年或 Visual C# 2008

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,如何使用結構化的例外處理在 Microsoft Visual C#.NET、 在 2005 年 Microsoft Visual C# 或 Microsoft Visual C# 2008年。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Visual C#.NET 或更新版本的 Visual C#

本文假設您已熟悉下列主題:
  • Visual C#.NET 或更新版本的 Visual C#
  • Microsoft Visual Studio.NET 或更新版本的 Visual Studio

結構化的例外處理

Visual C#.NET 提供提供一個功能強大的結構化的例外處理,並更容易閱讀的方式來處理錯誤的方法。結構化例外處理可讓您在相同的程序中其他錯誤處理常式內的錯誤處理常式巢狀化。結構化的例外處理使用類似的區塊語法 If......Else End If 陳述式。這使得 Visual C#.NET 程式碼或程式碼在較新版本的 Visual C# 更容易閱讀且更容易維護。您可以處理例外狀況在 Visual C#.NET 或更新版本 Visual C# 中使用例外處理陳述式的組合:
  • 請嘗試
  • 攔截
  • 最後
  • 擲回
基本語法結構化的錯誤處理的是,如下所示:
try
{
  // Code that is expected to raise an exception.
}
catch(Exception e)
{
  // Code that can handle an error.
}
finally
{
  // Code to do any final cleanup.
}
重試] 區塊中可以包含任何有效的 Visual C# 程式碼,或者可以包含在另一個的 try 區塊或 區塊的另一個階層架構。例外狀況發生在任何時間點,通用語言執行階段會尋找最接近 try 區塊,封入這段程式碼並不會執行任何額外的幾行程式碼。符合的 catch 區塊,如果有的話,並關聯 finally 區塊,然後會傳遞控制項。您也可以指定多個 catch 陳述式,讓每個 catch 區塊處理特定的錯誤。

攔截例外狀況

  1. Microsoft Visual Studio.NET 中請按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio.NET,然後再按一下 Microsoft Visual Studio.NET]。

    在 Microsoft Visual Studio 2005 中請按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio 2005,然後再按一下 [Microsoft Visual Studio 2005]。

    Microsoft Visual Studio 2008 中按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio 2008,然後再按一下 Microsoft Visual Studio 2008
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 在 [新增專案] 對話方塊,請依照下列步驟執行:
    1. 在 [專案類型 下, 按一下 [Visual C# 專案]。

      附註在 Visual Studio 2005 中或是在 Visual Studio 2008 中,按一下 Visual C#專案類型] 下。
    2. 在 [範本 下, 按一下 [主控台應用程式]。
    3. 在 [名稱] 方塊中,輸入 MyConsoleApp
    4. 在 [位置] 方塊中輸入 C:\,],然後再按一下 [確定]]。
  4. Main () 函式中加入下列程式碼:
    int a = 0;
    			int b = 10;
    			int c = 0;
    
    			try 
    			{
    				a = b / c;
    			}
    			catch (Exception e)
    			{
    				Console.WriteLine("A run-time error occurred.");
    			}
    			finally 
    			{
    				Console.ReadLine();
    			}
  5. 若要執行應用程式,請按一下 [在 偵錯] 功能表上的 [開始]。程式碼會嘗試除以 0 的數字。這項作業無效,且會造成除以零錯誤。不過,catch 區塊會攔截此錯誤,而主控台視窗顯示下列錯誤訊息:

    發生執行階段錯誤
  6. 關閉主控台視窗。

擷取多個例外狀況

本節會示範如何使用多個 catch 陳述式,以處理不同的錯誤。
  1. 開啟您在本文 「 Catch an Exception 」 一節中建立主控台應用程式專案。
  2. 以下列程式碼取代 Main () 函式中現有的程式碼:
    int a = 2147483647;
    			int b = 0;
    			int c = 0;
    
    			try 
    			{
    				 a = checked(a + 1);
    			}
    			catch (DivideByZeroException e)
    			{
    				Console.WriteLine("Error: Divide by Zero", e.Message);
    			}
    			catch (OverflowException e)
    			{
    				Console.WriteLine("Error: Overflow", e.Message);
    			}
    			finally 
    			{
    				Console.ReadLine();
    			}
    這個程式碼包含兩個 catch 區塊:
    • 一個 catch 區塊會攔截先前的除以零錯誤。
    • 一個 catch 區塊會攔截新的溢位錯誤。
  3. 若要執行應用程式,請按一下 [在 偵錯] 功能表上的 [開始]。主控台 視窗會顯示下列的錯誤訊息:
    錯誤: 溢位
  4. 關閉 主控台 視窗。
  5. 因為您永遠無法預期,可能就會發生每個錯誤,您可以新增所有您無法預期的例外狀況的 catch 區塊。比方說加入下列程式碼,最後 陳述捕捉任何無法預期的錯誤,並顯示適當的錯誤訊息之前:
    catch (Exception e)
    			{
    				Console.WriteLine("Error: ", e.Message);
    			}
  6. 在 [檔案] 功能表上按一下 [關閉方案]。

擲回例外狀況

結構化的例外處理使用 catch 陳述式來攔截例外狀況。使用結構化的例外處理您可以也擲回例外狀況。比方說您可能會發現它有用時擲回例外狀況執行資料驗證 屬性集 程因為您可能要擲回錯誤,如果違反商務規則。
  1. Microsoft Visual Studio.NET 中請按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio.NET,然後再按一下 Microsoft Visual Studio.NET]。

    在 Microsoft Visual Studio 2005 中請按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio 2005,然後再按一下 [Microsoft Visual Studio 2005]。

    Microsoft Visual Studio 2008 中按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio 2008,然後再按一下 Microsoft Visual Studio 2008
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 在 [新增專案] 對話方塊,請依照下列步驟執行:
    1. 在 [專案類型 下, 按一下 [Visual C# 專案]。

      附註在 Visual Studio 2005 中或是在 Visual Studio 2008 中,按一下 Visual C#專案類型] 下。
    2. 在 [範本 下, 按一下 [主控台應用程式]。
    3. 在 [名稱] 方塊中,輸入 MyNewConsoleApp
    4. 在 [位置] 方塊中輸入 C:\,],然後再按一下 [確定]]。
  4. 在 [專案] 功能表上按一下 新增類別
  5. 在 [加入新項目] 對話方塊在 [名稱] 方塊中輸入 clsPerson.cs],然後再按一下 [開啟舊檔]。

    附註在 Visual Studio 2005 中或是在 Visual Studio 2008 中,按一下 [新增]。
  6. clsPerson 類別中加入下列程式碼:
    public clsPerson()
    		{
    		}
    		private int mintAge;
    		public int Value;
    
    		public int Age
    		{
    			get
    			{
    				Age = mintAge;
    				return Age;
    			}
    
    			set
    			{
    				if(Value > 0)
    					mintAge = Value;
    				else
    					throw new ArgumentException("Age cannot be negative.");
    			}
    		}
    這個程式碼會建立一個 時代 的屬性。因為某個人不能有負面的年齡,如果類別的使用者嘗試將 時代] 屬性設定為小於 0 的是一個數字就會引發錯誤。
  7. Class1.cs 的將 Main ()] 函數中加入下列程式碼:
    clsPerson p = new clsPerson();
    
    			try 
    			{
    				p.Age = -1;
    			}
    			catch (Exception e)
    			{
    				Console.WriteLine(e.Message);
    			}
    			finally
    			{
    				Console.ReadLine();
    			}
  8. 若要執行應用程式,請按一下 [在 偵錯] 功能表上的 [開始]。[主控台] 視窗會顯示下列錯誤訊息:
    年齡不能為負數
  9. 關閉 主控台 視窗。

完成程式碼清單

攔截例外狀況

using System;

namespace MyConsoleApp
{
	class Class1
	{
		[STAThread]
  static void Main(string[] args)
		{
			int a = 0;
			int b = 0;
			int c = 0;

			try 
			{
				a = b / c;
			}
			catch (Exception e)
			{
				Console.WriteLine("A run-time error occurred.");
			}
			finally 
			{
				Console.ReadLine();
			}
		}
}
}

擷取多個例外狀況

using System;

namespace MyConsoleApp
{
	class Class1
	{
		[STAThread]
		static void Main(string[] args)
		{
			int a = 2147483647;
		
			try 
			{
				a = checked(a + 1);
			}
			catch (DivideByZeroException e)
			{
				Console.WriteLine("Error: Divide by Zero", e.Message);
			}
			catch (OverflowException e)
			{
				Console.WriteLine("Error: Overflow", e.Message);
			}
			catch (Exception e)
			{
				Console.WriteLine("Error: ", e.Message);
			}
			finally 
			{
				Console.ReadLine();
			}
		}
	}
}

擲回例外狀況

using System;

namespace MyNewConsoleApp
{

	class Class1
	{
		
		[STAThread]
		static void Main(string[] args)
		{
			clsPerson p = new clsPerson();

			try 
			{
				p.Age = -1;
			}
			catch (Exception e)
			{
				Console.WriteLine(e.Message);
			}
			finally
			{
				Console.ReadLine();
			}
		}
	}
public class clsPerson
	{
		public clsPerson()
		{
		}
		private int mintAge;
		public int Value;

		public int Age
		{
			get
			{
				Age = mintAge;
				return Age;
			}

			set
			{
				if(Value > 0)
					mintAge = Value;
				else
					throw new ArgumentException("Age cannot be negative.");
			}
		}
	}
}

?考

如需詳細資訊請造訪下列 Microsoft 網站]:
.NET 的例外狀況管理應用程式區塊
http://msdn2.microsoft.com/en-us/library/ms954830.aspx (http://msdn2.microsoft.com/en-us/library/ms954830.aspx)

這篇文章中的資訊適用於:
  • Microsoft Visual C# .NET 2003 標準版
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
關鍵字:?
kbmt kbprogramming kbexcepthandling kbhowtomaster KB816157 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:816157? (http://support.microsoft.com/kb/816157/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。