是否可以从故障点继续运行代码?

Ael*_*eis 1 .net c# database oracle exception-handling

好的,我有一些非常简单的代码,我将在下面发布.本质上,我有一个与数据库的连接,我想将查询中的列子集映射到特定的类.问题是这些可能为空.

我想知道是否有可能在特定行抛出异常,我们可以从下一行恢复整个块.

因此,如果以下代码执行,第6行捕获错误.是否有一种优雅的方法来捕获异常并使代码恢复在第7行继续运行.本质上使它就像第6行从未执行过一样.

 private static Column MapTableToColumn(OracleDataReader reader){
        Column c = new Column();
        c.ColumnName = Convert.ToString(reader["COLUMN_NAME"]);
        c.DataType = Convert.ToString(reader["DATA_TYPE"]);
        c.DataLength = Convert.ToInt32(reader["DATA_LENGTH"]);
        c.DataPrecision  = Convert.ToInt32(reader["Data_Precision"]);//<---Line 6
        c.DataScale = Convert.ToInt32(reader["Data_scale"]);//<--- Line 7
        c.AllowDBNull = Convert.ToBoolean(reader["ALLOW_DB_NULL"]);
        c.IsReadOnly = Convert.ToBoolean(reader["IS_READ_ONLY"]);
        c.IsLong = Convert.ToBoolean(reader["IS_LONG"]);
        c.IsKey = Convert.ToBoolean(reader["IS_KEY"]);
        c.KeyType = Convert.ToString(reader["KEY_TYPE"]);
        c.IsUnique = Convert.ToBoolean(reader["IS_UNIQUE"]);
        c.Description = Convert.ToString(reader["DESCRIPTION"]);
        return c;
    }
Run Code Online (Sandbox Code Playgroud)

重要的是要注意我不是要求最佳实践,这不是我打算在实际代码中使用的东西(除非它绝对天才).我只是想知道这是否可行以及如果有的话会怎么做.

我的研究

我的大多数研究都是主动的而不是反应性的.我会尝试知道给定字段在读取之前是否可能为null.如果是,那么我会检查以确定该字段是否为空,然后将其设置为默认值.它基本上避免了发生错误的可能性,我认为这是一个非常好的解决方案.我只想尝试这个,因为我知道当抛出异常时,最内部的异常包含抛出它的行号.基于此,如果您将异常置于抛出异常的类中,您应该假设能够使用反射以便从最后一点继续运行.我只是不确定你是怎么做的.我还考虑过可能会在每一行都设置尝试,我认为这会非常有效; 但是,我认为它会非常难看.

Ser*_*rvy 8

不,你要求的是C#中不可能的.

相反,解决此问题的正确方法是使用更好的解析方法,这些方法不会首先引发异常.如果输入值可以为null,则使用可接受空值的解析方法.

您可能需要做的第一件事是为int/bool字段使用可空类型,以便您可以支持空值.接下来,您需要创建自己的方法来解析您的int/bools.如果您的输入为null,则返回null,否则,使用int.TryParse,bool.TryParse或者as如果您的输入是正确的类型,则返回null ,只需转换为object.

然后通过使用这些方法,而不是Convert,您将不会首先抛出异常(即使它可以工作,您也不应该在此处执行异常,因为异常是针对特殊情况,而不是预期的控制流).


Eri*_*ert 7

如果预期例外,则不例外.绝不会永远不会捕获空引用异常.空引用异常是一个错误.相反,编写代码以避免错误.

您可以轻松编写测试null的辅助方法,或者使用类似的方法Int32.TryParse来处理格式错误的字符串.

  • 然而,数据读取器涉及一种不同的null - 实际上,它们甚至不是"null" - [IMO仍会导致比它解决的更多问题](http://stackoverflow.com/questions/4488727/what- is-the-point-of-dbnull/9632050#9632050) - 该语言没有任何处理`DBNull`的好方法 (2认同)