2015-03-25 77 views
4

如果我想要写一个文件和处理IOExceptions(如果该文件是写保护),我会做到以下几点:处理不可预见的异常

try 
{ 
    var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); 
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default) 
    {  
     sw.WriteLine(entry); 
    } 
} 
catch (IOException ex) 
{ 
    return ex.Message; 
} 

如果我得到一个意外的异常我的计划会崩溃,用户会报告错误,我会解决它。这就是我想要的。

所以我要补充另一个抓这样的:

catch (Exception) 
{ 
    throw; 
} 

这会不会使任何区别,什么是最好的做法?

回答

3

你应该处理突发异常向用户呈现,但有throw一个catch是多余的 - 异常反正你的方法被抛弃了。你应该问自己一个问题:“我能在这里做些什么?”。对于IOException,答案很清楚。您希望发生异常,可以处理它,并且可以继续。在通用Exception的情况下,这可能不是处理它的地方。

如果在发生异常时需要运行一些代码,请为其添加一个catch。如果您的代码在该异常之后无法继续,请抛出异常更高(未处理该异常或使用throw),并在调用层次结构中向上调整处理程序。也许它可以在更高层次上处理,并且可以继续执行。否则,您的应用程序将需要退出。

您可以在程序的入口点添加顶级try/catch块,并在那里捕获未处理的异常。你的应用程序甚至可以在这之后继续下去(但是,在任何非平凡的应用程序中,考虑到此时抛出的异常程度有多高)不太可能。要捕获任何其他未处理的异常(例如,在线程中未处理的异常),可以向AppDomain.CurrentDomain.UnhandledException添加处理程序。但是,这是不可恢复的 - 您的应用程序将在之后直接退出。 UnhandledException处理程序是在发生异常之前对异常执行某些操作的最后机会,通常将其记录为诊断出错的地方。噢,另外,如果你正在编写一个WPF应用程序,你可以在你的App.xaml中添加一个处理程序来处理Application上的DispatcherUnhandledException事件。这会捕获WPF调度程序线程中发生的任何未处理的异常。与上面的AppDomain处理程序不同,调度程序线程上的未处理异常可以继续执行 - 如果可以继续应用程序,则可以将事件参数中的IsHandled设置为true

0

您好,如果你想抛出异常,应用程序会崩溃做到这一点

try 
{ 
    var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None); 
    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default) 
    {  
     sw.WriteLine(entry); 
    } 
} 
catch (IOException ex) 
{ 
    throw ex; 
} 

但在我看来,你不应该让它破碎而只显示错误消息

在catch通话功能

写入文件,然后返回消息并显示给用户。希望它可以帮助

public static void WriteCustomLog(string msg) 
      { 
       FileStream fs = null; 
       StreamWriter sw = null; 
       FileStream fs1 = null; 
       StreamWriter sw1 = null; 
       try 
       { 
        //check and make the directory if necessary; this is set to look in the application 
        //folder, you may wish to place the error log in another location depending upon the 
        //the user's role and write access to different areas of the file system 
        if (!System.IO.Directory.Exists(Application.StartupPath + "\\Log\\")) 
         System.IO.Directory.CreateDirectory(Application.StartupPath + "\\Log\\"); 

        string date = DateTime.Now.ToString("dd_MM_yyyy"); 

        //check the file 
        fs = new FileStream(Application.StartupPath + "\\Log\\Log" + date + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); 
        sw = new StreamWriter(fs); 
        sw.Close(); 
        fs.Close(); 

        //log it 
        fs1 = new FileStream(Application.StartupPath + "\\Log\\Log" + date + ".txt", FileMode.Append, FileAccess.Write); 
        sw1 = new StreamWriter(fs1); 
        sw1.Write(DateTime.Now.ToString() + " Message: " + msg + Environment.NewLine); 
        sw1.Write("Date/Time: " + DateTime.Now.ToString() + Environment.NewLine); 
        sw1.Write("=======================================================" + Environment.NewLine); 

       } 
} 

,然后处置 未测试

+0

我不希望应用程序崩溃在IOException上,因为我可能会发生并因此发生它。它是关于我不除外的例外。我应该抓住他们,抛出或不做任何事情。 – Daltons 2015-03-25 10:40:47

+0

因此,在异常显示中将消息返回给用户并写入带有错误的自定义日志(返回ex.Message;) – Max 2015-03-25 10:44:31

+2

这会重置堆栈跟踪 – 2015-03-25 10:45:09

-1

你可以捕获该异常,然后检查里面,什么类型的expception是对象。然后决定如何处理它。

catch(Exception ex) 
{ 
    if(ex.InnerException is IOException) 
    { 
    // do something 
    } 
else 
    { 
    // do something else 
    } 
} 
+1

为什么?您可以捕获(IOException),然后通过链接处理程序来回退到Exception()。 – kha 2015-03-25 10:42:05

+1

@kha:你没注意到他检查了INNER异常吗?你无法理解。 – jgauffin 2015-03-25 10:46:22

+0

@jgauffin问题是关于捕获IOException和调用方法时可能发生的其他类型的异常,并且此答案检查捕获所有异常的内部异常作为执行此操作的一种方式。这种方法是错误的:并不是每个异常都有一个InnerException,并且并不是每个IOException都被重新抛出(事实上,如果它是重新抛出IOException的标准行为,我会感到惊讶),这意味着此解决方案不会处理IOException异常的原因,而不是作为IOException对象的InnerException异常的另一种类型重新抛出。 – kha 2015-03-25 10:56:03

1

所以我要补充另一个像抓

(几乎)从不。至少没有在堆栈跟踪中。它会让你的应用程序更难阅读。

大多数应用程序都有切入点。例如,如果您正在编写Windows服务,则通常会为该工作创建线程。你可以有一个catch (Exception),以防止它们崩溃。

所以我说的是,你应该在大多数情况下只使用捕获全部在顶层,以防止你的应用程序难以阅读或维护。

当一切都失败

有时你的应用程序崩溃,无论如何,如果你已经忘记了一个包罗万象的地方在顶层。

然后,您需要使用AppDomain.UnhandledException,因为它在.NET中调用所有应用程序类型。但是,它不会让你阻止应用程序开发,而只是为了记录你的应用程序即将崩溃的原因。

如果您正在编写基于winforms的UI应用程序,则可以使用Application.ThreadException代替。但是,它只会处理UI线程中的异常。因此,您仍然需要使用AppDomain.UnhandledException来记录其他线程上抛出的异常。

.NET中的所有主要库/框架都有它自己的方法来允许您处理未处理的异常。您需要查看您正在使用的库的文档。

+0

您也可以使用我们的服务http://onetrueerror.com,为您提供所有集成服务。 – jgauffin 2015-03-25 10:47:30

0
catch(Exception) 
{ 

    throw;  
} 

什么都不做。它的原始堆栈跟踪引发异常,并且不执行其他操作。你能赶上一般例外,它给你的选项,以提供额外的记录和/或一个更好的错误信息

catch(Exception ex) 
{ 
    LogError(ex); 
    if (weDontCareThisWasntImportantAnyWay) 
    { 
     if (theUserShouldBeNotifiedAtThisPoint) 
     { 
      SomehowNotifyTheUser(ex); 
     } 
    } 
    else 
    { 
     //Maybe something else cares 
     throw;  
    } 
}