Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 太多的.NET异常_C#_.net_Exception - Fatal编程技术网

C# 太多的.NET异常

C# 太多的.NET异常,c#,.net,exception,C#,.net,Exception,我们有一个生成大量异常的代码块(显然是IndexOutOfRangeException)。它可能产生高达50000/秒的速度。他们被抓到了,但cpu真的出现了峰值。代码块只是检查IDataRecord中的列。但是,该块非常通用,如果该列不存在,则会捕获异常并返回布尔值 如果不是因为例外情况的数量,这就不会是一个问题。我认为解决这个问题的唯一方法是在处理之前遍历IDataRecord的列,看看该列是否在那里,但这似乎也是一个昂贵的步骤,因为这是一个流量非常高的应用程序,在访问任何列之前都会有这个循

我们有一个生成大量异常的代码块(显然是IndexOutOfRangeException)。它可能产生高达50000/秒的速度。他们被抓到了,但cpu真的出现了峰值。代码块只是检查IDataRecord中的列。但是,该块非常通用,如果该列不存在,则会捕获异常并返回布尔值

如果不是因为例外情况的数量,这就不会是一个问题。我认为解决这个问题的唯一方法是在处理之前遍历IDataRecord的列,看看该列是否在那里,但这似乎也是一个昂贵的步骤,因为这是一个流量非常高的应用程序,在访问任何列之前都会有这个循环


我只是想了解一些想法。

首先确保您要查找的专栏存在。不仅抛出异常通常会对性能造成更大的影响,而且所有这些虚假异常可能会在代码中隐藏合法的bug

确保列首先存在的最佳方法是使所有这些
IDataRecord
类符合此函数关于它们包含的数据类型的假设。或使函数与实际数据一致。让一个过程假设一个值在不存在时存在,这意味着程序的结构与它实现的业务逻辑不匹配,这是一种不应该允许持续存在的情况

第二步是在每个对象的字段中循环,看看它实际上包含哪些字段,但这闻起来像是在地毯下扫出了一个更深层次的问题


但是,无论如何,您都不应该依赖异常来控制流。

如果您正在通过索引检查列。您应该首先避免异常。请使用
IDataRecord
IsDBNull
方法查看更多信息

是的,您应该首先检查一个列是否存在,这就是为什么您会得到
索引AutoFrangeException

“我认为解决这个问题的唯一方法是在处理之前遍历IDataRecord的列以查看该列是否存在”

只有在超出数组末尾时,才会发生此错误。您不需要单步遍历每一列,只需获取当前列的“count”

for(int i=0;i

据我所知,一个异常大约需要5000-10000个时钟周期。在大多数情况下,遍历列会便宜得多,但我确信对象的属性会让您知道存在多少列,而不必每次都实际计算它们。

修复代码
IndexOutOfRangeException
是您永远不会看到的异常之一!处理例外情况不是正确的方法。我建议将注意力集中在抛出这些异常的原因上。异常处理不是免费的,并且该卷根本不是轻量级的。这种类型的异常几乎总是可以避免的。首先,防止异常通常比处理异常便宜数百倍。其次,访问不存在的索引是一个bug。程序逻辑完全错误。不要继续在这个大洞上贴墙纸;修复漏洞。@EricLippert:如果正在查找的索引和要在其中搜索的内容是由外部数据源确定的(例如,正在反序列化的文件),该怎么办?如果要反序列化文件,可以在尝试使用之前检查从文件读取的索引,但是如果无效索引的结果是中止反序列化,那么在“常见”情况下添加更多工作是否真的有什么好处?当然,如果越界索引是一种常见情况(如OP的问题),那么检查它是有意义的,但是当一个错误的条件应该导致异常时,为什么不让它发生呢?@supercat:这是一个很好的例子。这是一个现实的用户场景,因此应该包含在处理反序列化的程序子系统的规范中。如果我为这样一个子系统编写规范,我的规范可能会说,用户可能会以某种方式提供“损坏”的文件。如果文件损坏,则反序列化子系统将检测损坏的文件并引发自定义的“损坏文件”异常。抛出“坏索引”并期望调用者知道这意味着“损坏的文件”是非常糟糕的设计。同意。我对调用代码没有控制权,尽管在这方面进行清理是不可取的。似乎大家的共识是在执行之前确保列存在。我会试试看它有多贵。那么,检查列是否存在的最佳方法是什么?你能为第二段中描述的内容提供一个代码示例吗?我们是按名称而不是索引访问列的。“r.GetSchemaTable().Columns.Contains(字段)”
for(int i = 0; i < column.count; i++)
{
dowork(column[1]);
}