2012-03-22 7 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

ここで考える2つのものがあります

  1. は、アプリケーションの通常の流れが突然それが機能しなくなりますポイントに停止されますか?例外はまさにそのことです。例外的なもの(通常、異常など)が発生したという通知です。例外でない場合は、例外をスローしないでください。ユーザーが注意せずに引き続きプログラムを使用できる場合は、例外を使用しないでください。

  2. メソッドの宣言をどのようにコメントするかは、これに影響します。コメントには、どんな例外がスローされるのか、どのような状況でスローされるのかを説明できるマークアップタグが必要です。彼らは、次のようになります。その名の通り

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

APIは、アプリケーションへの玄関口です。 apiでエラーが発生した場合、apiが、なぜ、どこでいつエラーが発生したか、つまりapiが例外をスローすることを、消費者に伝えることが最も有用です。これをキャッチしてユーザーに何をすべきかを伝えるのは消費者の責任です。ビジネスロジックが適切に定義されていれば、コンシューマーは別の実行パスを計算します。上記の例では、これは私の経験則です

上記の例では、アセンブリロードサービスによってエラーがスローされます。あなたはAPIでこれを処理する場合、消費者は、例外処理への一般的なガイドラインについて:)

は、私が正常にしようとすると、プログラムの流れを制御するために、例外を使用しないよう Msdn

関連する問題