2012-03-22 3 views
2

Я создаю API для своего программного обеспечения для домашних животных, и я в следующей ситуации:Какое подходящее время для исключения исключений в API?

Служба, использующая другую услугу. У меня есть служба, которая использует другую службу для загрузки сборки, следует ли исключить исключение в службе, которая загружает сборку или службу, использующую эту услугу?

AssemblyService:

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

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

      return assembly; 
     } 

     ... 

    } 

Услуги, которые используют 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 как в примере выше?

Я пытаюсь узнать, как обрабатывать исключения, в приведенном выше примере линия assembly = Assembly.Load(assemblyName); может бросить ArgumentNullException, ArgumentException, FileNotFoundException, FileLoadException и BadImageFormatException. Должен ли я обрабатывать все эти исключения?

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 выбрасывает исключение. это зависит от потребителя, чтобы поймать это и сказать своим пользователям, что делать или если бизнес-логика определена хорошо, потребитель будет вычислять альтернативные пути реализации. это мое эмпирическое правило

в примере выше службы загрузки сборок должно выдать ошибку.Если вы справиться с этим в апи, то потребитель никогда не научится :)

для общих руководящих принципов обработки исключений смотрите здесь в Msdn

Смежные вопросы