吃异常

时间:2010-10-19 21:23:36

标签: c# .net exception error-handling

我正在解析一个不时有MalFormed数据的文件。

它抛出异常,

我想从异常中恢复并忽略格式错误的数据。

最好的方法是什么?

try{
// parse file
}catch(Exception){
//eat it.
}

* 编辑: *我想,我的问题很难理解。我想从异常中恢复,任何例外,我不希望我的程序停止。但要继续。

8 个答案:

答案 0 :(得分:7)

我认为你问的是:

逐行解析文件时,有时当前行的数据格式错误,导致代码中抛出异常。也许您只需要构造代码,使得try / catch只围绕解析代码,而不是行读取代码。例如:

using System;
using System.IO;
using System.Windows.Forms;

public void ParseFile(string filepath)
{
    TextReader reader = null;

    try
    {
        reader = new StreamReader(filepath);

        string line = reader.ReadLine();
        while (!string.IsNullOrEmpty(line))
        {
            try
            {
                // parse line here; if line is malformed, 
                // general exception will be caught and ignored
                // and we move on to the next line
            }
            catch (Exception)
            {
                // recommended to at least log the malformed 
                // line at this point
            }

            line = reader.ReadLine();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("Exception when trying to open or parse file", ex);
    }
    finally
    {
        if (reader != null)
        {
            reader.Close();
            reader.Dispose();
        }
        reader = null;
    }
}

外部try / catch块用于在尝试打开或读取文件时发生某些事情时正确关闭读取器对象。如果读取数据格式错误且无法正确解析,则内部try / catch块将吞下引发的异常。

但我同意其他所有人的观点。吞下异常可能不太好。至少,我建议你把它记录在某个地方。

答案 1 :(得分:5)

简而言之,您可能不应该使用例外。像TryParse这样返回false的东西更有效,更容易恢复。异常处理是一种钝的对象方法。

MSDN Guidance on Exception Handling

答案 2 :(得分:3)

一般来说,这样的事情:

try
{
    // parse file
}
catch (FormatException)
{
    // handle the exception
}
finally
{
    // this block is always executed
}

你应该避免捕捉一般的Exception案例,而是抓住一个特定的例外,无论可能是什么。

答案 3 :(得分:2)

这里有一些很好的背景信息: Is there any valid reason to ever ignore a caught exception

简短回答:以这种方式使用例外是很昂贵的。如果可能的话,在发送输入进行处理之前测试输入并忽略那些而不是忽略异常。

同时确保您没有过多的网络并且吃掉您可能想知道的合法例外。

答案 4 :(得分:1)

如果您希望仅针对解析特定的错误抛出一个或两个特定的异常类型,那么捕获一般异常是一个坏主意。通常最好捕获每个特定的异常类型并独立处理它,以便您的代码不会抑制任何其他(可能是意外的)错误(例如,如果文件丢失,或者网络连接超时,是否应该在同样的方式,如果文件包含损坏的数据?)

但是,如果您故意需要/希望捕获所有可能的错误并优雅地继续,那么捕获一般异常是一个好主意。如果对所有错误类型的处理是相同的(例如“如果由于任何原因,我无法读取此偏好值,我将返回默认值5” - 这可能会发生 - 这比程序崩溃无限好,因为你没有' t意识到它可能因网络超时而引发异常)。如果明智地使用,这种方法可以使您的程序防弹 - 但如果使用不明智,您可以抑制您需要了解和修复的错误,这可能非常痛苦。

在抑制任何异常时,您应该始终仔细考虑错误报告 - 您是否应该告诉用户您遇到了问题?您是否应该将其记录在跟踪文件中,以便当客户抱怨某些功能不正常时,您可以追溯到问题的根源?或者你应该默默地忽略它?要小心,因为过度热心的抑制会使得很难弄清楚为什么程序会出现不可预测的行为。

答案 5 :(得分:0)

try{
   // parse file
   }
   catch(Exception){
     //eat it.
   }
   finally 
   {
      //cleanup  must ... release system resources here (e.g. stream.Close() etc)
      // code here always executes...even if the exception is unhandled

   }

// code will resume execution from this point onwards...

答案 6 :(得分:0)

这样做 - 也许您可以记录错误,如果您想查看导致异常发生的数据,并使用它来改进解析逻辑。

答案 7 :(得分:0)

我觉得你看到的东西像黑& amp;白色,这感觉不对..是的,大多数时候,当涉及到输入的验证时,抓住所有东西并且很邋is并不好,但并非总是如此。这可能是一个特例。我不知道将要解析什么类型的文件,但异常可能是正确的。

在我们决定什么是最好的之前,请告诉我们更多详情:)