2009-06-24 4 views
1

Я пишу еще одну реализацию ActiveRecord для компании, которая меньше боится моего кода, чем обозначение «Release Candidate» для реализации CastleProject. Во всяком случае, я использую атрибуты каждого свойство базового класса, чтобы сопоставить их с возвращающимися столбцами набора данных:Какой. 2.0 2.0 Исключение я должен бросить в этом обстоятельстве?

[ResultColumnAttribute("CUST_FIRST_NAME")] 
public string FirstName 
     { 
      get { return _columnName; } 
      set { _columnName = value; } 
     } 

так, что когда я создаю экземпляр класса из DataSet, я назначу, что значение свойства значения столбца. Какое исключение следует бросать, когда столбец сопоставляется с атрибутом, но не отображается в DataSet? Я не хочу идти и писать пользовательский (ленивый), и я думаю, что Application.Exception немного неописуемо.

+1

В то время, когда вы задали этот вопрос, вы могли написать собственное исключение – AgileJon

ответ

8

Это исключение локализуется в вашем домене, и поэтому я думаю, вам лучше написать свой собственный InvalidMappingException.

Вот как я бы писать:

[Serializable] 
public class InvalidMappingException : Exception 
{ 
    public InvalidMappingException() { } 

    public InvalidMappingException(String message) 
     : base(message) { } 

    public InvalidMappingException 
     (String message, Exception innerException) 
      : base(message, innerException) { } 

    protected InvalidMappingException 
     (SerializationInfo info, StreamingContext context) 
      : base(info, context) { } 
} 
+1

+1, пользовательские исключения занимают несколько секунд, чтобы писать и бесценны для «хорошей» обработки исключений. –

+0

Согласовано, это ситуация, когда вам нужно собственное исключение. +1 –

+0

Я удивлен, что никто не создал шаблон T4 для пользовательских исключений. –

0

Во-первых, замок Виндзор теперь официально версия 2, нет релиз-кандидат :)

Я думаю, что есть только ограниченный набор исключений в рамки .NET вы можете действительно бросить из кода:

  • NotImplementedException
  • InvalidOperationException
  • ArgumentException
  • ArgumentNullException

может быть больше, я надеюсь на другие должности. Если ни один из них не подходит, вы должны написать свой собственный. С фрагментом кода «exc» в Visual Studio ленивость на самом деле не является аргументом.

+0

Мы рассматриваем корень «Исключение» как утверждение и разрешаем его выбросить. – Joshua

1

Я бы написал специальное исключение, специфичное для вашей реализации. Это очень конкретная, настроенная ситуация, и пользовательское исключение, вероятно, будет лучше, чем что-либо еще.

Для меня, в данном случае, (lazy) не достаточно хорошая причина, чтобы избежать добавления маленький, крошечный кусочек кода, необходимого, чтобы сделать специальное исключение, когда это оправдано ...

0

Согласовано, что вы должны просто напишите свой собственный (heck, просто введите исключение и нажмите Tab, а редактор сделает 2/3 работы за вас!), но если нет, я бы, вероятно, пошел с ArgumentException.

2

Я не вижу причин не использовать InvalidOperationException. Помните, что, если ваши вызывающие лица не сделают что-то программное с вашим исключением, тип исключения не имеет значения. Например, если они собираются поймать его явно или ссылаться на какое-либо свойство вашего исключения, тогда вам понадобится один из ваших.

В противном случае встроенные исключения будут выполнены.


См How to Design Exception Hierarchies по Кшиштоф Квалина, соавтор Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries.

+0

+1 для связанных ссылок –

1

Поскольку «throw new Exception» теперь официально плохой стиль и не в моде, я бросаю InvalidOperationException («описательное сообщение») для всех ошибок, которые мне слишком ленивы, чтобы написать собственную ошибку.

+0

@Matthew: где вы видите, что бросать новое исключение не в стиле? –

+0

Это так не в стиле, это повсюду ... – Sekhat

+0

FxCop бросает вас в тюрьму за него;) – womp

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