2010-08-12 96 views
7

我正在寫一個使用自動控制另一個程序的c#應用程序。當然,該計劃必須運行我的程序工作。當我的程序查找應用程序並找不到它時,我想拋出一個異常(當然,以後我可以嘗試打開應用程序,或者告訴用戶打開它,或者...)。這種情況下拋出什麼類型的異常?

我應該實現自定義異常 - 還是使用現有的NotSupportedException(或其他.NET異常之一)。如果自定義異常,你會建議什麼?我正在考慮實現一個自定義異常,我將其稱爲MyAppNameException,然後使用該消息來聲明問題是什麼?

是否有任何通用規則拋出異常的方式,使您的程序更具可讀性和用戶友好性,還是我只是給這太多的想法:)?

謝謝!

回答

8
  1. 首先,將MyAppCustomException定義爲抽象基類。

  2. 然後從它繼承AppNotFoundCustomException

這樣你就可以趕上從您的應用程序的所有異常,或者只是具體的。

下面是一些示例代碼說明了這一概念:

public abstract class MyAppCustomException : System.Exception 
{ 
    internal MyAppCustomException(string message) 
     : base(message) 
    { 
    } 

    internal MyAppCustomException(string message, System.Exception innerException) 
     : base(message,innerException) 
    {    
    } 
} 

public class AppNotFoundCustomException : MyAppCustomException 
{ 
    public AppNotFoundCustomException(): base("Could not find app") 
    { 
    } 
} 

而這裏的客戶try/catch例如:

try 
{ 
    // Do Stuff 
} 
catch(AppNotFoundCustomException) 
{ 
    // We know how to handle this 
} 
catch(MyAppCustomException) // base class 
{ 
    // we don't know how to handle this, but we know it's a problem with our app 
} 
+0

從'System.Exception'派生時,[最好實踐三個推薦的公共構造函數](https://msdn.microsoft.com/en-us/library/87cdya3t%28v=vs.110% 29.aspx)。也就是說,在問題描述的情況下,拋出例外可能不是最好的方法。請參閱@Hans Passant的[答案](http://stackoverflow.com/a/3471960/1497596)。 – DavidRR 2015-12-07 19:48:27

3

我用的Framework Guidelines book表明您應該只創建一個自定義異常時,錯誤條件可以以不同於任何現有的例外的方式以編程方式處理。

就你而言,如果你想創建一個自定義的異常來啓動後端安裝程序,那是獨一無二的,我認爲自定義的異常是可以的。

否則,一些來自System.Runtime.InteropServices.ExternalException heirarchy可能是適當的。

+0

+1僅用於創建自定義異常,如果您打算以自定義的方式處理它們。如果你實際上可以在你描述的情況下做一些程序化的事情,那麼我會按照PostMan的建議去做。 – jloubert 2010-08-12 22:03:22

1

是的,你正在過度使用它。當你拋出一個異常時,沒有什麼好的事情發生,任何異常,當你這樣做的時候,這個程序不會神奇地開始運行。只有不好的事情可能發生,比如一些代碼實際上捕捉到異常並試圖繼續。或者沒有人捕獲它並獲得Windows錯誤報告對話框。不妨放上一個消息框,並使用Environment.Exit()來調用它。

當然,如果您發現它沒有運行時真正啓動該程序,它可能對用戶更有用。

+0

+1我同意,在這種情況下真正的例外有什麼好處。它有0值。 – JonH 2010-08-12 21:43:12

0

您當然不應該使用NotSupportedException,因爲您的建議,因爲您的應用程序確實支持有問題的方法。 NotSupportedException在實現接口或抽象類時使用,但有些成員沒有完全實現,因爲它們在上下文中沒有意義(從輸出流讀取,清除只讀集合等)。

更接近的匹配是InvalidOperationException,其中可以使用成員,但沒有給出當前狀態。

你說「應用程序」,它建議一個可執行文件,而不是一個組件供其他人使用。在這種情況下,您不會將異常冒泡到調用代碼(因爲沒有調用代碼),而是會引發對話(對於GUI應用程序)或寫入Console.Error(對於控制檯應用程序)。這使得您可能只是要顯示異常的Message屬性的值,或者您只需要類類型來標記特定的消息。無論是簡單地從Exception中派生AppNotRunningException,還是直接使用Exception都可能會非常好用,具體取決於您最方便的哪兩種。

相關問題