Введение
Когда пользователь создает ошибку в конфигурации NLog (например, недопустимый XML), мы (NLog) бросаем NLogConfigurationException
. Исключение содержит описание, что не так.
Но иногда этот NLogConfigurationException
"съедается" System.TypeInitializationException
, если первый вызов NLog происходит из статического поля/свойства.
Пример
например. если у пользователя есть эта программа:
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 было необработанным Сообщение: Необработанное исключение типа "Исключение System.TypeInitializationException" произошло в файле mscorlib.dll Дополнительная информация: инициализатор типа для "TypeInitializationExceptionTest.Program" сделал исключение.
Итак, сообщение ушло!
Вопросы
- Почему внутреннее исключение не видно? (тестируется в Visual Studio 2013).
- Можно ли отправить дополнительную информацию в
TypeInitializationException
? Как сообщение? Мы уже отправляем внутреннее исключение. - Можно ли использовать другое исключение или есть свойства на
Exception
, чтобы сообщалось больше информации? - Есть ли другой способ дать (более) обратную связь с пользователем?
Примечания
- Конечно, мы не имеем никакого влияния на программу, написанную пользователем.
- Я один из разработчиков NLog.
- Вам нравится тестировать его самостоятельно? Оформить заказ https://github.com/NLog/NLog/tree/TypeInitializationException-tester и запустить NLog/src/NLog.netfx45.sln
Edit
обратите внимание, что я являюсь хранителем библиотеки, а не пользователем библиотеки. Я не могу изменить код вызова!