Будьте осторожны, если вы выбираете исключения, это дорого.Это дает вашему коду контроллера дополнительную вложенность, в зависимости от того, сколько исключений может быть сгенерировано.На самом деле вы должны генерировать исключение только для исключительного условия, а не что-то, что должно обрабатываться обычным потоком вашего приложения.
Я бы пошел по другому маршруту, предложенному Вутером де Кортом, используйте тип возврата изсервис для объекта обмена сообщениями.Вы можете ввести объект возврата в простом перечислении с различными случаями, с которыми может столкнуться служба.Они выглядят лучше в контроллере, потому что вы можете обрабатывать enum с помощью переключателя / регистра, а не try / catch.
Обновление
Как может выглядеть объект сообщения:
public interface IServiceAbc
{
ServiceResponse InvokeMyService([params]);
}
public enum ResponseScenario
{
Success,
DatabaseFailed,
BusinessRuleViolated,
ValidationRuleViolated
}
public class ServiceResponse
{
public ResponseScenario Scenario { get; internal set; }
public string Message { get; internal set; }
}