我们有一个WPF应用程序,其中部分可能会在运行时抛出异常.我想全局捕获任何未处理的异常并记录它们,但是否则会继续执行程序,好像什么也没发生(有点像VB On Error Resume Next).
这可能在C#中吗?如果是这样,我究竟需要将异常处理代码放在哪里?
目前我看不到任何可以包装a try/ catcharound的单点,哪些可以捕获可能发生的所有异常.即便如此,由于捕获,我会留下任何被执行的东西.或者我在这里想到可怕的错误方向?
ETA:因为下面有很多人指出:该申请不是用于控制核电厂.如果它崩溃了并不是什么大问题,但是大多数与UI相关的随机异常在它将被使用的上下文中是一种麻烦.有(也可能仍然是)其中一些,因为它使用插件架构,可能会被其他人扩展(在这种情况下也是学生;所以没有经验丰富的开发人员能够编写完全无错误的代码).
至于被捕获的异常:我将它们记录到日志文件中,包括完整的堆栈跟踪.这就是这项工作的重点.只是为了对抗那些在字面上对VB的OERN进行类比的人.
我知道盲目忽略某些类错误是危险的,可能会破坏我的应用程序实例.如前所述,这个程序对任何人来说都不是关键任务.在他们正确的思想中没有人会打赌人类文明的存在.它只是一个用于测试某些设计方法的小工具.软件工程.
为了立即使用该应用程序,异常可能会发生很多事情:
对于程序生成的实验数据:严重错误最坏的情况是不会导致数据被记录.稍微改变实验结果的微妙变化是不太可能的.即使在这种情况下,如果结果看起来很可疑,则会记录错误; 如果它是一个完整的异常值,那么仍然可以丢弃该数据点.
总结一下:是的,我认为自己仍然至少部分理智,我不认为一个全局异常处理例程让程序运行必然是完全邪恶的.如前所述,根据申请,这样的决定可能是有效的.在这种情况下,它被认为是一个有效的决定,而不是完全和彻底的废话.对于任何其他应用程序,决策可能看起来不同 但请不要因为我们忽视错误而指责我或其他从事该项目的人可能会炸毁这个世界.
附注:该应用程序只有一个用户.数百万人使用的不是像Windows或Office这样的东西,在这种情况下,向用户提供异常泡沫的成本本来就是非常不同的.
我有一个全天候运行的.Net流程,每周崩溃一次或两次.我有连接到log4net的AppDomain.CurrentDomain.UnhandledException事件,事件永远不会被触发!记录任何事情都会导致进程崩溃!这看起来像.Net运行时/ CLR错误,因为我在事件日志中收到一条消息".NET Runtime 2.0 Error".
我正在运行.Net 3.0 Sp1.
有人可以帮我弄清楚如何解决这个问题吗?
事件日志消息: .NET Runtime 2.0错误类型:错误事件ID:1000
事件日志描述:错误应用程序appName.exe,版本0.0.0.0,邮票4ca5d33d,错误模块mscorwks.dll,版本2.0.50727.3607,邮票4add5446,调试?0,故障地址0x0010724e.
我正在使用AvalonDock 2.0,当我打开一个dock容器时,在调试模式下应用程序崩溃(它在没有调试的情况下运行时工作正常).我得到以下异常:
WindowsBase.dll中发生了未处理的"System.ComponentModel.Win32Exception"类型异常
附加信息:操作成功完成
我遇到了这个答案,建议取消选中"例外设置"中的框.有线的事情是它第一次使用它.但它不再存在了.我试过其他机器也不行.任何有关如何解决此问题的建议.
Avalon代码(第5行引发的异常)
protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
if (msg == Win32Helper.WM_WINDOWPOSCHANGING) {
if (_internalHost_ContentRendered) {
// the below line throw the exception
Win32Helper.SetWindowPos(_internalHwndSource.Handle, Win32Helper.HWND_TOP, 0, 0, 0, 0, Win32Helper.SetWindowPosFlags.IgnoreMove | Win32Helper.SetWindowPosFlags.IgnoreResize);
}
}
return base.WndProc(hwnd, msg, wParam, lParam, ref handled);
}
Run Code Online (Sandbox Code Playgroud) 当我在事件处理程序中抛出异常时,异常处理程序没有被调用?
从以下开始的精简示例的示例代码:
应用程序.xaml
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="App_DispatcherUnhandledException" >
<Application.Resources/>
</Application>
Run Code Online (Sandbox Code Playgroud)
应用程序.xaml.cs
using System.Windows;
using System.Windows.Threading;
namespace WpfApplication1
{
public partial class App : Application
{
//This method is called when ButtonA is clicked, but not when ButtonB is
//clicked (and a (random) file is selected ofcourse).
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message, "An exception occurred", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
主窗口.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button A" HorizontalAlignment="Left" Margin="10,10,0,0" …Run Code Online (Sandbox Code Playgroud) 我们的应用程序是模块化的(模块组执行特定的事情).这些模块具有事件处理程序.可以从其他模块或应用程序菜单触发这些事件.
情况:
模块A(具有UI)接收事件"deleteitem".事件参数应包含要删除的项目名称.但在这种情况下它是null.在某个地方,有人搞砸了什么.
问题(S):
模块应该抛出吗?记住,该模块将抛入事件处理程序并可能导致应用程序崩溃,因为模块编写者不知道是否处理了异常.
上述场景是关于从模块excpetions这可能导致应用程序崩溃的投掷一个更大的问题的snaphot.反对它的论点是应用程序可以在没有特定模块的情况下继续工作.那么,谁应该确保 - 模块或应用程序?
我正在开发一个使用 plain 实现的项目threads。应用程序中的大多数预期异常都会得到处理,但是,在某些情况下,其中一个线程会引发意外异常,并且应用程序会崩溃(应用程序是基于两者的,I/O因此Client-Server实际上不可能处理所有异常)。
为了解决这个问题,我尝试定义一个全局变量UnhandledExceptionHandler,以便应用程序显示友好的消息而不是崩溃。这是我尝试过的:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// The rest of the startup logic goes here
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Utilities.DisplayUnhandledException((Exception)e.ExceptionObject);
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用。从未被CurrentDomain_UnhandledException调用过。不幸的是,我无法更改应用程序的结构,这意味着我无法使用任务并行库。我不明白为什么这不起作用。还有其他方法可以处理线程中抛出的异常吗?任何帮助表示赞赏。