如何在构造函数传递异常类型时抛出自定义异常

时间:2010-03-04 20:19:04

标签: c# .net clr

我创建了在构造函数

中采用Exception类型的类
    private readonly Exception _exception;

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

我想抛出异常

throw new _exception("");

但是我收到了错误: '._exception'是'字段',但用作'type'

是什么方法可以扔掉它?

6 个答案:

答案 0 :(得分:4)

这根本不是一个好习惯。这样做会导致丢失与堆栈跟踪相关的信息。请考虑阅读Eric Lippert博客的这一部分:

Too Much Reuse

写作时

throw new Exception();

您实例化此新异常。但是,由于你的私有成员_exception已经被实例化,你不需要重新实例化它,即实例化一个实例,这是没有意义的。相反,请使用以下内容:

throw _exception;

这样就可以了。

答案 1 :(得分:3)

重新抛出现有的异常,例如使用

throw _exception;

但是,这将修改异常实例中的调用堆栈,因此您将丢失异常的原始源。如果要避免这种情况,可以将实例作为内部异常抛出新异常。

答案 2 :(得分: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);
   }
}

您需要确保跟踪内部异常,因为这将首先提供有关导致异常的最有用的调用堆栈信息。

答案 3 :(得分:2)

throw _exception;

答案 4 :(得分: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();

        }
    }
}

答案 5 :(得分:0)

我怀疑你真正想要的是抛出你建议类型的新例外,在这种情况下传入一个“Type”参数(甚至使用泛型)将是前进的方法。

然而,我无法想象这是一个明智的设计选择,所以我不得不敦促你重新考虑(并且可能会发布更多你的要求,以便有人能提出更好的选择!)。 / p>