2010-03-04 2 views
0

я создал класс, который принимает тип исключения в конструктореКак бросить пользовательские исключения, когда тип исключения был принят конструктором

private readonly Exception _exception; 

    public StringToObject(Exception exception) 
    { 
     _exception = exception; 
    } 

я хотел бросить за исключение

throw new _exception(""); 

, но я получил сообщение об ошибке: '._exception' - это поле, но используется как «тип»

- это любые возможные способы его бросить?

ответ

4

Это не очень хорошая практика. Это приведет к потере информации о трассировке стека. Пожалуйста, обратите внимание читать этот раздел блога Эрика Липперта:

Too Much Reuse

Когда вы пишете

throw new Exception(); 

инстанцировании это новое исключение. Но тогда, поскольку ваше частное сообщение _exception уже создано, вам не нужно повторно его создавать, это экземпляр экземпляра, что не имеет смысла.Вместо этого используйте следующее:

throw _exception; 

Это сделает это.

+0

+1 для ссылки слишком много Повторное использование –

2
throw _exception; 
+1

Имейте ввиду, что это приведет к потере исходного стека вызовов из исключения, которое было использовано для создания этого объекта в первую очередь, тем самым ограничивая его значение. – Nick

3

Для повторного выбрасывания существующего исключения, как такое использование

throw _exception; 

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

0

Этот пример должен работать. Я включил все классы, участвующие в этом примере.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class MyException : Exception 
    { 
     public MyException(string message) : base(message) 
     {} 

     //... 
    } 

    public class MyClass 
    { 
     private Exception exception; 

     public MyClass(Exception e) 
     { 
      this.exception = e; 
     } 

     public void ThrowMyException() 
     { 
      throw exception; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyException myExceptionInstance = new MyException("A custom message"); 
      MyClass myClassInstance = new MyClass(myExceptionInstance); 


      myClassInstance.ThrowMyException(); 

     } 
    } 
} 
0

Я подозреваю, что вы действительно ищете, чтобы бросить новое исключение из вашего Рекомендуемого типа, в этом случае прохождения в параметре «Тип» (или даже используя общий) будет путь вперед ,

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

3

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

Сначала определим собственный класс исключений, производный от Exception:

public class MyCustomException : Exception // Or you could derive from ApplicationException 
{ 
    public MyCustomException(string msg, Exception innerException) 
    : base(msg, innerException) 
    { 
    } 
} 

Вы можете также задать дополнительные параметры в пользовательском конструктору исключения, чтобы содержать даже больше информации, если вы хотите. Затем в коде приложения ...

public void SomeMethod() 
{ 
    try 
    { 
     // Some code that might throw an exception 
    } 
    catch (Exception ex) 
    { 
     throw new MyCustomException("Additional error information", ex); 
    } 
} 

Вы хотите быть уверены, чтобы следить за внутреннее исключение, потому что будет иметь самый полезный стека вызовов информацию о том, что вызвало исключение в первую очередь ,