【发布时间】:2016-05-01 20:56:45
【问题描述】:
简介
当用户在 NLog 的配置中创建错误(如无效的 XML),我们(NLog)抛出一个NLogConfigurationException。异常包含错误说明。
但有时如果第一次调用 NLog 来自静态字段/属性,则 NLogConfigurationException 会被 System.TypeInitializationException“吃掉”。
示例
例如如果用户有这个程序:
using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
namespace TypeInitializationExceptionTest
{
class Program
{
//this throws a NLogConfigurationException because of bad config. (like invalid XML)
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main()
{
Console.WriteLine("Press any key");
Console.ReadLine();
}
}
}
并且配置有错误,NLog 抛出:
throw new NLogConfigurationException("Exception occurred when loading configuration from " + fileName, exception);
但用户会看到:
“将异常详细信息复制到剪贴板”:
System.TypeInitializationException 未处理 消息:在 mscorlib.dll 中发生“System.TypeInitializationException”类型的未处理异常 附加信息:“TypeInitializationExceptionTest.Program”的类型初始化程序引发了异常。
所以消息消失了!
问题
- 为什么 innerException 不可见? (在 Visual Studio 2013 中测试)。
- 我可以向
TypeInitializationException发送更多信息吗?喜欢留言吗?我们已经发送了一个 innerException。 - 我们是否可以使用另一个异常,或者
Exception上是否有属性以便报告更多信息? - 是否有其他方式可以向用户提供(更多)反馈?
备注
- 当然我们对用户编写的程序没有影响。
- 我是 NLog 的维护者之一。
- 您喜欢自己测试吗?签出https://github.com/NLog/NLog/tree/TypeInitializationException-tester 并启动 NLog/src/NLog.netfx45.sln
编辑:
请注意,我是库维护者,而不是库的用户。 我无法更改调用代码!
【问题讨论】:
-
这几乎是 CLR 的行为,您无能为力。大多数人应该知道他们需要查看
InnerException,ToString()还将打印内部异常的消息和堆栈跟踪。你唯一能做的就是返回一个无操作记录器,这样用户的应用程序就不会崩溃,但你会得到明显的影响。 -
@LucasTrzesniewski 但为什么甚至是
InnerExceptionnull?此外,“将异常详细信息复制到剪贴板”也不会揭示原因! (在 DEBUG 中测试) -
对不起,我无法复制这个。我得到一个
NLogConfigurationException类型的非空InnerException和消息:Error when setting property 'Layout' on NLog.Targets.DatabaseParameterInfo,它本身有一个ArgumentException类型的InnerException和消息LayoutRenderer cannot be found: 'thisIsWrong' -
这是帖子.. 虽然与答案cshandler.com/2016/02/why-typeinitializationexception-has.html 差别不大
-
但是,就像@HansPassant 所说,如果您打开“使用托管兼容模式”,则“查看详细信息...”链接在“异常”弹出窗口中可见,您可以在那里看到内部异常.所以内部异常只是没有正确报告。对我来说仍然像一个错误。
标签: c# .net visual-studio exception nlog