Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中对未处理的异常编写小型转储有意义吗?_C#_.net_Wpf - Fatal编程技术网

C# 在.NET中对未处理的异常编写小型转储有意义吗?

C# 在.NET中对未处理的异常编写小型转储有意义吗?,c#,.net,wpf,C#,.net,Wpf,当我在异常处理程序中时,似乎如下所示: AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; 或者像这样: AppDomain.CurrentDomain.UnhandledException += Curre

当我在异常处理程序中时,似乎如下所示:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
或者像这样:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
堆栈已展开以调用我的自定义未处理异常处理程序。此时编写一个小型转储似乎没有意义,因为堆栈已经展开。 如果不展开堆栈,应用程序将无法理解是否未处理此异常

即使我可以在unhandledExceptionEventTargets.ExceptionObject中看到堆栈,我也无法在应用程序崩溃的确切位置获得小型转储

还有别的办法吗

我知道我可以要求系统写转储,但我应该是管理员

更新:


嗯。我有一个想法)如果在FirstChanceException处理程序中,我可以回溯堆栈,看看这个异常是否未处理,那就太好了。但这应该足够快,可以在生产中使用。

您正在寻找的是在堆栈展开之前提升的转储。

我自己从未使用过转储。通常只知道异常发生的位置就足够了。但是你是对的,知道值等会更方便。在最新版本的错误记录器中,我甚至传递了3个可选参数,这些参数被转储到日志中,这很有帮助。类似于(简化的):

用法是

public static T Deserialize<T>(string file)
{
    try
    {
        ...
    }
    catch (Exception e)
    {
        Log("xml", exception: e, param: file, param2: typeof(T));
    }
    return default(T);
publicstatict反序列化(字符串文件)
{
尝试
{
...
}
捕获(例外e)
{
Log(“xml”,异常:e,param:file,param2:typeof(T));
}
返回默认值(T);
}


这不是对你问题的回答,而是如何在没有垃圾的情况下舒适生活的解决方案。

@SriramSakthivel:是的;如果您想在堆栈展开之前捕获它,则无法判断它是否会被处理。是的,您是对的。但是为每个FirstChanceException编写一个小型转储是一种浪费资源的行为。@norekhov:您无法预测在堆栈展开之前是否会处理异常。你想做什么?我想知道有没有办法。也许通过反射检查try/catch?因此,这个问题的最佳答案是“不,你不能”@norekhov:展开堆栈正是CLR搜索
catch
块的方式。除非您编写自己的CLR(或使用进程外调试器或评测API),否则您无法做到这一点<代码>异常本身包含
堆栈跟踪
。异常包含StackTrace,您可以说(例如)某个函数中发生了NullPointerException。但使用minidump,您可以看到发生此异常的确切变量和环境。仅在AppDomain.UnhandledException事件的处理程序中写入minidump。DispatcherUnhandledException处理程序对此没有用处。最好完全避免。