2012-03-22 55 views
2

我正在爲我的寵物軟件構建API,並處於以下情況:什麼時候在API中引發異常?

使用其他服務的服務。我有一個使用其他服務來加載程序集的服務,我應該在加載程序集的服務或使用該服務的服務中引發異常嗎?

AssemblyService:

public class CommandService : ICommandService 
    { 
     private readonly IAssemblyService assemblyService; 

     public CommandService(IAssemblyService assemblyService) 
     { 
      this.assemblyService = assemblyService; 
     } 

     public CommandOutput Process(string inputCommand, string requestInfo) 
     { 
      string commandName = GetAssemblyName(inputCommand); 
      string args = GetArgs(inputCommand); 

      Assembly assembly = assemblyService.Load(commandName); 

      if (assembly == null) throw new UnknownCommandException(commandName); 

      ICommand command = assemblyService.GetCommand(assembly); 

      return command.Execute(args, requestInfo); 
     } 

     #region Private methods 
     ... 
     #endregion 
    } 

我應該拋出異常的AssemblyService或CommandService像上面的例子:使用AssemblyService

public class AssemblyService : IAssemblyService 
    { 
     public Assembly Load(string assemblyName) 
     { 
      Assembly assembly; 

      try 
      { 
       assembly = Assembly.Load(assemblyName); 
      } 
      catch 
      { 
       assembly = null; 
      } 

      return assembly; 
     } 

     ... 

    } 

服務?

我想學習如何處理一個例外,在上面的例子中的線assembly = Assembly.Load(assemblyName);可以拋出ArgumentNullExceptionArgumentExceptionFileNotFoundExceptionFileLoadExceptionBadImageFormatException。我應該處理所有這些例外嗎?

UnknownCommandException(commandName) is a custom exception. 

其他問題:任何人誰在使用我的API可以知道什麼時候一個方法可以拋出一個異常?我將鼠標放在.Net Framework的任何方法上,您會看到該方法是否會拋出異常。這可以用我的API的方法嗎?

回答

1

我通常儘量避免使用異常來控制程序的流程。您的程序使用異常將其轉換爲結果變量,然後將其轉換回異常。爲什麼不一直堅持例外?我會改變它如下:

public class AssemblyService : IAssemblyService 
{ 
    public Assembly Load(string assemblyName) 
    { 
     return Assembly.Load(assemblyName);   
    } 
} 

public class CommandService : ICommandService 
{ 
    private readonly IAssemblyService assemblyService; 

    public CommandService(IAssemblyService assemblyService) 
    { 
     this.assemblyService = assemblyService; 
    } 

    public CommandOutput Process(string inputCommand, string requestInfo) 
    {   
     string commandName = GetAssemblyName(inputCommand); 

     try 
     { 
      string args = GetArgs(inputCommand); 

      Assembly assembly = assemblyService.Load(commandName); 
      ICommand command = assemblyService.GetCommand(assembly); 
      return command.Execute(args, requestInfo); 
     } 
     catch (Exception ex) 
     { 
      //Log original exception or add to inner exception 
      throw new UnknownCommandException(commandName); 
     }      
    } 
} 
5

你的標題是關於拋出異常,但你實際上似乎在談論捕捉異常。一般情況下,您應該不會捕獲異常,除非您可以做一些有意義的事情來糾正引起異常首先拋出的情況,在這種情況下,您應該只捕獲您可以處理的顯式異常類型。

2

有值得考慮兩件事情:

  1. 將應用程序的正常流動被突然停止的地步,這將不再起作用?例外情況正是如此 - 一個例外情況(不尋常,異常等)發生的通知。如果不是特例,請不要拋出異常。如果用戶可以不注意地繼續使用該程序,則不要使用異常。

  2. 如何評論方法聲明會影響到這一點。應該有一些評論的標記標籤,這將允許你解釋拋出什麼異常以及在什麼情況下拋出異常。他們是這樣的:顧名思義

    /// <exception cref="ExceptionTypeGoesHere"></exception> 
    
1

API是通往一個應用程序。如果api發生錯誤,那麼api告訴消費者錯誤發生的原因,發生的位置和時間,即api拋出異常是非常有用的。消費者應該瞭解這一點並告訴其用戶該做什麼,或者如果業務邏輯被很好地定義,消費者就會計算出可選的執行路徑。這是我的經驗法則

在上面的例子中,程序集加載服務應該拋出錯誤。如果您處理這個在API,那麼消費者永遠也學不會:)

的異常處理的一般準則看這裏Msdn

相關問題