我们有一个包含多个项目的VS2013解决方案(最初是VS2012解决方案,但这不相关)。一些类库。一些MVC应用程序。一些WinForm应用程序。一些comandline应用程序。我们想要的是一个类,我们可以在所有项目中使用它来获取未处理的异常并将它们记录到可配置的目标(特定的应用程序可以决定是否要记录到flatfile,事件日志或db)。这个想法是,在启动时,应用程序将调用静态方法,或实例化一个对象,然后任何未处理的异常将被神奇地记录为应用程序的其余部分。
我认为这样可以解决问题(尽管第一次尝试只是登录到平面文件):
public class InfLogger
{
public string LogFile { get; set; }
public InfLogger()
{
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ThreadExceptionHandler);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionsHandler);
LogFile = "C:\\Infinedi.log";
}
public void ThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
try
{
if (File.Exists(LogFile))
{
File.AppendAllText(LogFile, e.Exception.Message + "\n");
}
else
{
File.WriteAllText(LogFile, e.Exception.Message + "\n");
}
}
catch (Exception ex)
{
}
}
public void UnhandledExceptionsHandler(object sender, UnhandledExceptionEventArgs e)
{
try
{
if (File.Exists(LogFile))
{
File.AppendAllText(LogFile, (e.ExceptionObject as Exception).Message + "\n");
}
else
{
File.WriteAllText(LogFile, (e.ExceptionObject as Exception).Message + "\n");
}
}
catch (Exception ex)
{
}
}
}
}
但没有快乐。
在我用来尝试测试它的MVC应用程序中,我实例化InfLogger对象,然后有目的地创建一个超出范围的未处理异常的数组索引。但是记录器不会触发任何事件处理程序。 :(
有关如何实现这一目标的任何建议吗?
我做了一些研究,这实际上适用于控制台应用程序和winforms。但只是没有MVC。嗯......不知道为什么。但是我发现了一个新问题。这是代码的使用位置。
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
InfLogger logger = new InfLogger();
int[] a = { 0, 1, 2 };
int y = a[6];
}
}
}
记录器确实捕获了异常。但执行只是挂起就行:int y = a [6]。它只是继续执行该行,抛出异常,一遍又一遍地捕获未处理的异常。所以现在我需要知道如何让执行实际移动到抛出异常的行。
答案 0 :(得分:0)
我调用Program.cs文件中的方法来设置未处理的异常方法。以下是MSDN处 Application.SetUnhandledExceptionMode方法的完整说明。
// ....
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
SetUnhandledExceptionHandler();
// ...
#region -- SetUnhandledExceptionsHandler() Method --
/// <summary>
/// Causes all unhandled exceptions to be handled by the application.
/// This will not prevent the application from being forced to close, but
/// does give a chance to log the error.
/// </summary>
public static void SetUnhandledExceptionHandler()
{
// Add an exception handler for all UI thread exceptions
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
// Set the unhandled exception mode to force all Windows Forms errors to
// Go through this handler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
#endregion