如何设置.NET异常对象的InnerException

43 .net c# reflection logging exception

当我在该对象的构造函数中时,如何设置对象的InnerException属性Exception?这归结为查找和设置没有setter的属性的支持字段.

顺便说一句:我已经看过这个evain.net - 使用Reflection获取支持属性的字段,但如果可能的话,寻找非基于IL的解决方案.

构造函数是创建类型Exception的地方Exception,所以我不能使用基类构造函数MyException() :base(...)等来调用它.

Mar*_*ell 83

您可以通过调用base ctor来设置内部异常:

public MyException(string message, Exception innerException)
       : base(message, innerException) {...}
Run Code Online (Sandbox Code Playgroud)

如果需要运行一些代码来获取异常,请使用静态方法:

public MyException(SomeData data) : base(GetMessage(data), GetInner(data)) {...}
static Exception GetInner(SomeData data) {...} // <===== your type creation here!
static string GetMessage(SomeData data) {...}
Run Code Online (Sandbox Code Playgroud)


Pao*_*sco 41

Exception类有一个重载的构造接受的内部异常作为参数:

Exception exc = new Exception("message", new Exception("inner message"));
Run Code Online (Sandbox Code Playgroud)

这是你想要的?

  • 虽然这并没有直接回答他的问题,但它解决了大多数搜索此问题的人所寻求的问题. (3认同)

Met*_*ght 13

为什么不能只调用构造函数将InnerException作为参数?如果由于某种原因不可能,System.Exception中的支持字段是:

private Exception _innerException;
Run Code Online (Sandbox Code Playgroud)

我发现它使用了Redgate的Reflector.使用反射我想你可以设置内部异常.

编辑:在大多数情况下,通过反射访问私有字段不是一个好主意,但我不太了解NT的情况,以确定它是好主意还是坏主意.

  • 我想不出一个明智的例子,反射是正确的方法...... (9认同)
  • 不,它没有.它真的没有; 它破坏了封装.在`:base(SomeMethod(...),...)`链中使用静态方法. (3认同)

dov*_*ove 8

Exception exceptionWithMoreInfo = new Exception("extra info", ex);
Run Code Online (Sandbox Code Playgroud)

这是正常的做法,假设您已经陷入了一个异常,您希望在冒泡之前添加更多信息.