Я сделал компонент, который выбрасывает исключение.Я думаю, следует ли мне придерживаться стандарта throw new Exception
или создавать особые исключения.
Я также считаю, что пользовательское исключение не является привлекательным, когда оно вызывает исключение из Remoting или WCF.если я использую стандартное исключение, вызывающий может получить исключение, если я создал пользовательское исключение, вызывающий не сможет получить конкретное исключение, если только сборка компонента не будет развернута на клиенте;тем не менее, клиент может получить исключение из определенных пользователем исключений, если один поймает определенное пользователем исключение из Remoting и WCF и повторно выбрасывает его как стандартное исключение, что, в свою очередь, противоречит цели определяемого пользователем исключения.
Когда добавление пользовательского исключения не так полезно?
[РЕДАКТИРОВАТЬ]
Делиться своими мыслями, я думаю, что пользовательское исключение является обязательным (хотя бы одно) на компоненте, поэтому при модульном тестировании собственного компонента вы не получите ложных срабатываний.
Это приводит к ложным срабатываниям:
[Test]
public void Tag_is_missing()
{
string message = "";
try
{
// Arrange
// this will fail on *nix systems
MyComponentHelper.ParseXml("C:\A.XML");
}
catch(Exception ex)
{
// Act
message = ex.InnerException.Message;
}
// Assert
// How can we be sure that the word "not found" error is from
// xml parsing or if from file loading? Doing Pokemon exception handling
// will lead to ambiguities
Assert.IsTrue(message.Contains("not found"));
}
Если вы не сделали свое собственное исключение, ваш модульный тест может получить ложные срабатывания, строка «not found» может быть из вашего компонента или из других подсистем вашего компонента.Итак, мой случай, когда нужно создать пользовательское исключение.
Это не приведет к ложным срабатываниям:
[Test]
public void Tag_is_missing()
{
string message = "";
try
{
// Arrange
// this will fail on *nix systems
MyComponentHelper.ParseXml("C:\A.XML");
}
catch(XmlParsingException ex)
{
// Act
message = ex.InnerException.Message;
// Assert
// And now we are more sure that the error didn't come from
// program subsystem; in particular, file subsystem.
Assert.IsTrue(message.Contains("not found"));
}
}
Остается задуматься над тем, когда нужно создавать очень специфичные пользовательские исключения.Сейчас я сначала остановлюсь на наличии только одного пользовательского исключения для моего компонента, модульное тестирование не должно давать ложных срабатываний.