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.如果是,那么我会检查以确定该字段是否为空,然后将其设置为默认值.它基本上避免了发生错误的可能性,我认为这是一个非常好的解决方案.我只想尝试这个,因为我知道当抛出异常时,最内部的异常包含抛出它的行号.基于此,如果您将异常置于抛出异常的类中,您应该假设能够使用反射以便从最后一点继续运行.我只是不确定你是怎么做的.我还考虑过可能会在每一行都设置尝试,我认为这会非常有效; 但是,我认为它会非常难看.
不,你要求的是C#中不可能的.
相反,解决此问题的正确方法是使用更好的解析方法,这些方法不会首先引发异常.如果输入值可以为null,则使用可接受空值的解析方法.
您可能需要做的第一件事是为int/bool字段使用可空类型,以便您可以支持空值.接下来,您需要创建自己的方法来解析您的int/bools.如果您的输入为null,则返回null,否则,使用int.TryParse,bool.TryParse或者as如果您的输入是正确的类型,则返回null ,只需转换为object.
然后通过使用这些方法,而不是Convert,您将不会首先抛出异常(即使它可以工作,您也不应该在此处执行异常,因为异常是针对特殊情况,而不是预期的控制流).
如果预期例外,则不例外.绝不会永远不会捕获空引用异常.空引用异常是一个错误.相反,编写代码以避免错误.
您可以轻松编写测试null的辅助方法,或者使用类似的方法Int32.TryParse来处理格式错误的字符串.