我的VS刚刚告诉我;
警告2 CA1031:Microsoft.Design:修改'Program.Main(string [])'以捕获比"Exception"更具体的异常或重新抛出异常.
我为什么要那样做?如果我这样做,并没有捕获所有异常来处理它们,我的程序崩溃与所有流行的报告屏幕.我不希望我的用户得到这样的错误废话!
为什么我不能立刻捕获所有异常,向用户显示一个很好的警告说:"出了问题,不关心它,我会处理它,只是耐心等待"?
编辑:刚看到我在这里有一个骗局,对不起那个杜普
编辑2:澄清事情; 在捕获任何异常后我退出程序!我只是不希望我的用户看到"向microsoft报告"对话框,该对话框在控制台应用程序中引发未处理的异常时显示!
我最初有代码处理DispatcherUnhandledException哪个会记录错误并将异常标记为已处理
protected override void OnStartup(StartupEventArgs e)
{
Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
...
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
// Log Error here
e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)
我试图通过涵盖更广泛的未处理异常来改善这一点
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
LogUnhandledException((Exception)ex.ExceptionObject,
"AppDomain.CurrentDomain.UnhandledException");
DispatcherUnhandledException += (s, ex) =>
LogUnhandledException(ex.Exception,
"Application.Current.DispatcherUnhandledException");
TaskScheduler.UnobservedTaskException += (s, ex) =>
LogUnhandledException(ex.Exception,
"TaskScheduler.UnobservedTaskException");
}
Run Code Online (Sandbox Code Playgroud)
但我无法使用此事件处理异常
private void LogUnhandledException(Exception e, string @event)
{
// Log Error here
e.Handled = true; //Doesn't work
}
Run Code Online (Sandbox Code Playgroud)
我如何处理所有类型的异常,以便代码尝试继续?
.NET编程指南声明我们不应该捕获一般异常.我假设以下代码不是很好,因为一般异常类型catch:
private object CreateObject(string classname)
{
object obj = null;
if (!string.IsNullOrEmpty(classname))
{
try
{
System.Type oType = System.Type.GetTypeFromProgID(customClass);
obj = System.Activator.CreateInstance(oType);
}
catch (Exception ex)
{
Log.Error("Unable to create instance for COM Object with class name " + classname + "\n" + ex.Message);
}
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,我捕获特定的异常但不是所有异常,然后我重新抛出异常,以防异常与非泛型异常.但是,函数"CreateInstance"可能会抛出许多异常(ArgumentNullException,ArgumentException,NotSupportedException,TargetInvocationException,MethodAccessException,MemberAccessException,InvalidComObjectException,MissingMethodException,COMException,TypeLoadException).
捕获所有其他个别例外是否可以接受?或者,还有更好的方法?
private object CreateObject(string classname)
{
object obj = null;
if (!string.IsNullOrEmpty(classname))
{
try
{
System.Type oType = System.Type.GetTypeFromProgID(customClass);
obj = System.Activator.CreateInstance(oType);
}
catch (NotSupportedException ex)
{
Log.Error("...." + ex.Message); …Run Code Online (Sandbox Code Playgroud)