我创建了在构造函数
中采用Exception类型的类 private readonly Exception _exception;
public StringToObject(Exception exception)
{
_exception = exception;
}
我想抛出异常
throw new _exception("");
但是我收到了错误: '._exception'是'字段',但用作'type'
是什么方法可以扔掉它?
答案 0 :(得分:4)
这根本不是一个好习惯。这样做会导致丢失与堆栈跟踪相关的信息。请考虑阅读Eric Lippert博客的这一部分:
写作时
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>