我有一个.NET程序,其事件处理程序绑定到Application.CurrentDomain.UnhandledException.使用调试运行程序时,抛出未处理的异常时会触发此事件.但是,在没有调试的情况下运行时,事件不会触发.
我的问题是什么?
谢谢,安德鲁
我正在尝试在我的monodroid应用程序中实现有效的异常处理,该应用程序是用Visual Studio的Xamarin.Android插件编写的.
我正在尝试处理两种类型的异常:
在全局处理程序的两种情况下,我想:
经过一定的调查后,我在这里和这里找到了一些答案,但除了AndroidEnvironment.UnhandledExceptionRaiser和AppDomain.UnhandledException之外什么都没有提出,它并不适用于所有情况.
我创建了一个简短的示例,我试图使用这两个处理程序:
AppDomain.CurrentDomain.UnhandledException += (s,e)=>
{
System.Diagnostics.Debug.WriteLine("AppDomain.CurrentDomain.UnhandledException: {0}. IsTerminating: {1}", e.ExceptionObject, e.IsTerminating);
};
AndroidEnvironment.UnhandledExceptionRaiser += (s, e) =>
{
System.Diagnostics.Debug.WriteLine("AndroidEnvironment.UnhandledExceptionRaiser: {0}. IsTerminating: {1}", e.Exception, e.Handled);
e.Handled = true;
};
Run Code Online (Sandbox Code Playgroud)
然后在按钮单击时,我添加了以下代码以引发两种类型的异常:
//foreground exception
throw new NullReferenceException("test nre from ui thread.");
//background exception
ThreadPool.QueueUserWorkItem(unused =>
{
throw new NullReferenceException("test nre from back thread.");
});
Run Code Online (Sandbox Code Playgroud)
因此,我对两种类型的异常都有不同的行为:
android exception-handling unhandled-exception xamarin.android xamarin
在制作WP7应用程序时,我遇到了这个奇怪的错误,我看不出原因.我得到的唯一输出/错误消息是"UnhandledException:参数不正确.::: ProgramName.App"
此错误随机发生,我没有从调试器获得有关如何解决它的任何信息.当我运行相同的代码两次,一次得到错误,另一次没有.所以,你们之前是否有过这个错误,也许可以告诉我它为什么会发生?这太令人沮丧了,因为它是随机发生的.任何提案都将受到高度赞赏:)
编辑:这是完整的堆栈跟踪:
at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
at MS.Internal.XcpImports.Collection_AddValue[T](PresentationFrameworkCollection`1 collection, CValue value)
at MS.Internal.XcpImports.Collection_AddDependencyObject[T](PresentationFrameworkCollection`1 collection, DependencyObject value)
at System.Windows.PresentationFrameworkCollection`1.AddDependencyObject(DependencyObject value)
at System.Windows.Controls.UIElementCollection.AddInternal(UIElement value)
at System.Windows.PresentationFrameworkCollection`1.Add(UIElement value)
at System.Windows.Controls.ItemsControl.AddVisualChild(Int32 index, DependencyObject container, Boolean needPrepareContainer)
at System.Windows.Controls.ItemsControl.AddContainers()
at System.Windows.Controls.ItemsControl.RecreateVisualChildren(IntPtr unmanagedObj)
at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element, Single inWidth, Single inHeight, Single& outWidth, Single& outHeight)
at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element, Size availableSize)
at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
at Microsoft.Phone.Controls.Pivot.MeasureOverride(Size availableSize)
at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Double inWidth, Double inHeight, Double& outWidth, Double& outHeight)
Run Code Online (Sandbox Code Playgroud) 在WPF应用程序中处理未处理异常的最佳方法是什么?
在TPL中,如果任务抛出异常,则捕获该异常并将其存储在Task.Exception中,然后遵循观察到的异常的所有规则.如果它从未被观察过,它最终会在终结器线程上重新抛出并使进程崩溃.
有没有办法阻止Task捕获该异常,只是让它传播?
我感兴趣的任务已经在UI线程上运行(由TaskScheduler.FromCurrentSynchronizationContext提供),我希望异常能够转义,因此它可以由我现有的Application.ThreadException处理程序处理.
我基本上希望Task中未处理的异常在按钮单击处理程序中表现得像未处理的异常:立即在UI线程上传播,并由ThreadException处理.
我有一个处理程序Application.ThreadException,但我发现异常并不总是正确传递给它.具体来说,如果我从BeginInvoke回调中抛出异常内部异常,我的ThreadException处理程序不会获得外部异常 - 它只获得内部异常.
示例代码:
public Form1()
{
InitializeComponent();
Application.ThreadException += (sender, e) =>
MessageBox.Show(e.Exception.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
var inner = new Exception("Inner");
var outer = new Exception("Outer", inner);
//throw outer;
BeginInvoke(new Action(() => { throw outer; }));
}
Run Code Online (Sandbox Code Playgroud)
如果我取消注释该throw outer;行并单击该按钮,则消息框将显示外部异常(以及其内部异常):
System.Exception:Outer ---> System.Exception:Inner
---内部异常堆栈跟踪的结束---
在C:\ svn\trunk\Code Base中的WindowsFormsApplication1.Form1.button1_Click(Object sender,EventArgs e) Source.NET\WindowsFormsApplication1\Form1.cs中:线55
在System.Windows.Forms.Control.OnClick(EventArgs的发送)
在System.Windows.Forms.Button.OnClick(EventArgs的发送)
在System.Windows.Forms.Button.OnMouseUp
System.Windows.Forms.BouttonBase.WndProc上的System.Windows.Forms.Control.WndProc(Message&m )处的System.Windows.Forms.Control.WmMouseUp(Message&m,MouseButtons按钮,Int32单击)
上的(MouseEventArgs mevent)
(Message&米)
在System.Windows.Forms.Button.WndProc(邮件&m)
在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(邮件&m)
在System.Windows.Forms.Control.ControlNativeWindow.WndProc(邮件&m)
在系统.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 …
这个问题的答案在哪里有用,谢谢我感谢帮助:)但我最终使用:http://code.msdn.microsoft.com/windowsdesktop/Handling-Unhandled-47492d0b#content
我想在应用程序崩溃时显示错误消息.
目前我有:
App.xaml:
<Application x:Class="WpfApplication5.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="App_DispatcherUnhandledException" // <----------------
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
代码隐藏App.xaml:
namespace WpfApplication5
{
public partial class App : Application
{
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("Caught Unhandled Exception!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当主线程发生错误时,该解决方案很有效.现在我的问题是如何能够捕获在不同线程上发生的错误?
换句话说:当我按下此按钮时,我能够捕获异常:( App_DispatcherUnhandledException被调用!)
private void button1_Click(object sender, RoutedEventArgs e)
{
int.Parse("lkjdsf");
}
Run Code Online (Sandbox Code Playgroud)
但是我无法捕捉到这个异常:
private void button1_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
int.Parse("lkjdsf");
});
}
Run Code Online (Sandbox Code Playgroud)
无论它们是否发生在主线程上,我如何能够捕获所有异常?
我刚刚开始玩procdump并且我希望在发生无意义的第二次机会异常时完全转储应用程序.
根据我运行的文档,它喜欢这样:
procdump.exe -ma -e -x C:\CrashDumps C:\Code\CrashApp\CrashApp\bin\Debug\CrashApp.exe
Run Code Online (Sandbox Code Playgroud)
CrashApp.exe是一个简单的控制台应用程序,在启动时抛出异常.
这是我得到的输出:
ProcDump v7.0 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards
Process: CrashApp.exe (6516)
CPU threshold: n/a
Performance counter: n/a
Commit threshold: n/a
Threshold seconds: 10
Hung window check: Disabled
Log debug strings: Disabled
Exception monitor: Unhandled
Exception filter: *
Terminate monitor: Disabled
Cloning type: Disabled
Concurrent limit: n/a
Avoid outage: n/a
Number of dumps: 1
Dump folder: C:\CrashDumps\
Dump …Run Code Online (Sandbox Code Playgroud) 我试图摆脱代码中的一些boost依赖项,而是使用新的C++ 11特性(Visual Studio 2013).
在我的组件之一我曾经boost::mutex一起boost::lock_guard<boost::mutex>和一切工作正常.当我std::mutex一起使用时std::lock_guard<std::mutex>,我从返回时收到以下错误main().
GrabberTester.exe中0x7721E3BE(ntdll.dll)的未处理异常:0xC0000005:访问冲突读取位置0xA6A6B491.
真正的项目非常复杂,因此难以提供完整的工作代码示例来重现此问题.在我的真实项目中,互斥体用在一个在运行时加载的共享库中(但是在我返回时应该已经卸载了它main()).
我的问题是:
boost::mutex和std::mutex设计表现完全相同?std::mutex代替boost::mutex?boost::thread框架创建线程.可能std::mutex只能用于std::threads并且与boost::threads 不兼容吗?我注意到的另一件事是:当我卸载动态加载的共享库时,这需要一些时间.(DLL访问硬件,干净地关闭所有内容需要一些时间).当我切换到std::mutex它时,看起来几乎可以立即卸载DLL,但程序然后在返回时崩溃main().我的印象是问题std::mutex特别是在DLL的上下文中.
应用程序和DLL都是使用v120工具集在Debug配置中新建的,并与运行时库(/ MTd)静态链接.
下面你可以找到callstack.例外似乎来自驱动程序中的某个地方.只是偶然我发现它与我使用的互斥锁的实现有关.
ntdll.dll!7721e3be()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7721e023()
kernel32.dll!76b014ad()
msvcr100.dll!71b0016a()
PS1080.dll!oniDriverDestroy() Line 29
OpenNI2.dll!oni::implementation::DeviceDriver::~DeviceDriver() Line 95
OpenNI2.dll!oni::implementation::Context::shutdown() Line 324
OpenNi2Grabber.dll!openni::OpenNI::shutdown() Line …Run Code Online (Sandbox Code Playgroud) 我希望能够在构建 Blazor 单页应用程序的一个地方捕获所有未处理的异常。就像在 WPF 应用程序中使用“Current.DispatcherUnhandledException”一样。
这个问题完全是关于客户端(webassembly)异常处理的。我正在使用 Blazor 版本 3.0.0-preview8.19405.7
我一直在寻找解决方案,但似乎它不存在。在 Microsoft 的文档 ( https://docs.microsoft.com/en-us/aspnet/core/blazor/handle-errors?view=aspnetcore-3.0 ) 上,有一个可能发生错误的地方列表以及有关如何操作的演练处理每一个。它相信必须有一种更防弹的方法来捕获所有。