【问题标题】:How to manage exception in catch block c#?如何管理catch块c#中的异常?
【发布时间】:2015-09-01 08:42:49
【问题描述】:

我有以下代码。

try
{
    int s=10;
    int k=0;
    int stdsd = s / k;
}
catch (DivideByZeroException ext)
{
    FileStream fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);  
    //encountered an exception as file doesn't exist.
}
catch (Exception ex)
{
}
finally
{
    //some code here.
}

在上面的代码中,当发生异常时,它会尝试将其写入 catch 块中的一个文件中。但是当它试图打开该文件时,该文件不存在,因此在这种情况下系统崩溃了。我想在 finally 块中执行这样的关键代码,但由于 catch 块中的异常,它不会更进一步。

我知道我们可以检查文件是否存在检查,但我不想在这里检查文件是否存在检查,我想知道如何在 catch 块中管理它。 能否请协助在 catch 块中管理异常的最佳方法。

【问题讨论】:

  • 良好的编程习惯——你应该有一个专门的方法/类来执行所有与日志相关的操作。顺便说一句,在写入文件之前不要检查文件是否存在,这是一个糟糕的编程设计,因为在File.Exists 调用到File.Write 调用之间可能会删除文件
  • 为什么不将打开的文件封装在 try catch 块中?

标签: c# exception


【解决方案1】:

您无法处理与同一try/catch 语句关联的catch 块中的一个catch 块生成的异常。相反,您需要一个额外的:

catch (DivideByZeroException ext)
{
    try
    {
        FileStream fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);  
    }
    catch (IOException e)
    {
        // Handle the exception here
    }
}

请注意,您应该在打开流时使用using 语句,这样无论以后是否引发异常,您都会自动关闭它。

我还建议不要catch 块中直接使用这样的代码 - 通常catch 块应该很短,以便于阅读。考虑将所有错误处理功能移到一个单独的方法(甚至可能是一个单独的类)中。

【讨论】:

    【解决方案2】:

    只需使用另一个try {} catch {} ...

    try { 
        // ...
        try {
            // try opening your file here ...
        } catch (Exception) {
            // ...
        }
    } catch (Exception) {
        // ...
    }
    

    【讨论】:

      【解决方案3】:

      如果您不想检查“这里”文件是否存在(在异常中),那么您也可以检查“那里”是否存在,即:在代码的前面。

      据我了解,您要做的是将异常日志写入文件。因此,您可以在代码的早期配置正确的日志文件处理,最好的情况是使用一个好的日志文件处理程序。在此之后,您在异常处理程序中唯一需要做的就是将您的异常消息推送到日志处理程序 - 然后它将将此信息正确地写入文件。

      【讨论】:

        【解决方案4】:

        异常是任何语言的强大未来,在大多数情况下都不能被忽视,但如果可能的话尽量避免

        看看这个

                    String File = "File.txt";
                    System.IO.FileInfo fileinfo = new System.IO.FileInfo(File);
        
                   if(fileinfo.Exists)
                   {
                       using (System.IO.FileStream file = new System.IO.FileStream(File, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
                     {
                         // operation on file here
                     }
                   }else
                   {
                       using (System.IO.FileStream file = new System.IO.FileStream(File, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
                       {
                           // operation on file here now the file is new file 
                       }
                   } 
        

        【讨论】:

        • 如果在您检查 fileinfo.Exists 后立即删除(或创建)文件怎么办?如果它存在但它被锁定或只读怎么办?在处理文件系统时,很难避免处理异常。
        猜你喜欢
        • 2017-03-31
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多