Как создать пользовательское исключение, когда конструктор передал тип исключения - PullRequest
0 голосов
/ 04 марта 2010

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

    private readonly Exception _exception;

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

я хотел выбросить исключение

throw new _exception("");

но я получил ошибку: «._exception» является «полем», но используется как «тип»

есть ли какие-нибудь возможные способы его бросить?

Ответы [ 6 ]

4 голосов
/ 04 марта 2010

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

Слишком много повторного использования

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

throw new Exception();

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

throw _exception;

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

3 голосов
/ 04 марта 2010

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

Сначала определите пользовательский класс исключений, производный от 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);
   }
}

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

3 голосов
/ 04 марта 2010

Чтобы сбросить существующее исключение, подобное этому, используйте

throw _exception;

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

2 голосов
/ 04 марта 2010
throw _exception;
0 голосов
/ 04 марта 2010

Я подозреваю, что на самом деле вы ищете новое исключение из предложенного вами типа, и в этом случае передача параметра "Тип" (или даже использование универсального) будет способом продвижения вперед.

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

0 голосов
/ 04 марта 2010

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

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();

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...