Механизм регистрации Prism в основном используется для регистрации сообщений, связанных с событиями Prism.
Чтобы использовать его для ваших событий, вы можете создать и расширить метод, например,
public static class LoggerExtensions
{
public static void Warn(this ILoggerFacade loger, string message)
{
using (StreamWriter s = File.AppendText("Log.txt"))
{
s.WriteLine(string.Format(" {0}-{1}: {2}", DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss.ffff"), Category.Warn, message));
s.Close();
}
}
}
И чтобы использовать его внутри своего кода, вы можете сделать следующее
var logger = _container.Resolve<ILoggerFacade>(); //If you use IoC
LoggerExtensions.Warn(logger, "Some exception...");
Но он по-прежнему не регистрирует исключения, выданные в моем приложении
Я бы предложил добавить Dispatcher.UnhandledException
внутрь App.xaml.cs
, поэтому, где бы ни было исключение, которое не было обработано, оно закончится там.
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//Your code
}
}
Обновление № 2
Я создал небольшой пример, где при нажатии кнопки выбрасывается DivideByZeroException
. Механизм регистрации Prism вообще не знает об этом исключении. Единственное решение - использовать метод расширения, класс Exception или другие библиотеки.
Я просто не вижу другого решения.
public partial class ViewA : UserControl
{
ILoggerFacade logger;
public ViewA(ILoggerFacade _logger)
{
InitializeComponent();
logger = _logger;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
var val = 0;
var result = 1500 / val;
}
catch (Exception ex)
{
LoggerExtensions.Warn(logger, ex.Message);
}
}
}