【问题标题】:C# Exception handling that won't break application不会破坏应用程序的 C# 异常处理
【发布时间】:2020-04-12 09:29:54
【问题描述】:

我是一名绿色 C# 程序员,我正在尝试向应用程序添加异常处理,但不确定实现我正在寻找的结果的正确方法。我正在解析 CSV 并获取始终在同一个位置的值。如果一个空白或格式不正确的文件通过它会导致应用程序崩溃,我想防止这种情况发生。如果发生异常,我不想存储文件中的值,而是想在字符串变量中存储一个空格字符。这是我的代码:

using (StreamReader inputGetData = new StreamReader(filename.FullName))
            {
                //STORE DATA STRIPPED FROM MDT FILE
                lotID = inputGetData.ReadLine().Split(',')[2];
                exatronFile = inputGetData.ReadLine().Split(',')[2];
                rofinFile = inputGetData.ReadLine().Split(',')[2];
                lotQty = inputGetData.ReadLine().Split(',')[2];
                serialize = inputGetData.ReadLine().Split(',')[2];
                serialStart = inputGetData.ReadLine().Split(',')[2];
                serialInc = inputGetData.ReadLine().Split(',')[2];
                partNum = inputGetData.ReadLine().Split(',')[3];
                inputGetData.ReadLine();
                dieMNF = inputGetData.ReadLine().Split(',')[3];
                assemblySub = inputGetData.ReadLine().Split(',')[3];
                countryOrigin = inputGetData.ReadLine().Split(',')[3];
                dateCode = inputGetData.ReadLine().Split(',')[3];
                QMLcomp = inputGetData.ReadLine().Split(',')[3];
                prefix = inputGetData.ReadLine().Split(',')[3];
                serialNum = inputGetData.ReadLine().Split(',')[3];
                suffix = inputGetData.ReadLine().Split(',')[3];
                inputGetData.ReadLine();
                packageCode = inputGetData.ReadLine().Split(',')[1];

所以理想情况下,我想尝试每一行,如果发生异常则捕获异常,将其抛出到更高的日志记录方法,然后将“”存储到变量中。如果我将最后一部分放入 finally 块中,即使没有正确发生异常,它也会始终运行?我怎样才能做到这一点?

【问题讨论】:

  • 如果您执行空值和长度检查而不是链接表达式,则可以完全避免异常。如果您知道如何通过预先测试条件来避免异常,那么您应该这样做。
  • 为什么不创建一个方法来读取一行,拆分它,检查是否有足够的项目,然后相应地返回?例外是针对特殊情况的,没有理由在这里一直重复同一段代码
  • 这是解析 CSV 文件的随机提示:查看 CsvHelper 包。这不是必需的,但它可以让事情变得更容易。
  • 感谢大家的及时回复! @SamiKuhmonen 这看起来是个完美的主意,我很感激!
  • CSV 格式比你想象的要复杂,Splitdoes not parse CSV。有许多CSV parsers 可以正确处理它们。

标签: c# exception try-catch try-catch-finally


【解决方案1】:

正如 cmets 中所建议的,有一些软件包可以简化您的生活。

如果您想以艰难的方式做事(没有什么反对的:p),您始终可以使用(甚至是本地)函数添加中间步骤:

    string Extract(string s, int position)
    {
        var split = s.Split(',');
        return split.Length > position ? split[position] : " ";
    }

    lotID = Extract(inputGetData.ReadLine(), 2);

【讨论】:

    【解决方案2】:

    您可以对每个分配使用以下函数调用:

    public T TryCatch<T>(Func<T> tryCatched, T returnedOnFailure)
    {
        try
        {
            return tryCatched();
        }
        catch
        {
            return returnedOnFailure;
        }
    }
    

    如果您想收集有关发生的异常的信息,您可以将out Exception exception 作为最后一个参数。

    要调用它,只需为您的情况执行lotID = TryCatch(() =&gt; inputGetData.ReadLine().Split(',')[2], " ");

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 2015-08-26
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多