最近有人提出在lucene.net中:
Throwing an exception as a result of a normal situation is extremely bad in .net 。
在QueryParser\FastCharStream.cs 中 Refill() 方法里有这么一段:







我们知道,在net中捕捉异常是比较耗资源的。
这里有篇文章对异常做了性能分析和测试:Performance implications of Exceptions in .NET
初看代码,感觉比较奇怪,为什么要对charsRead做异常处理?是否可以改成这样:



为什么会造成死循环?此段异常处理干嘛用的?造成死循环的地方是在ReadChar()方法里(确切的说是调用ReadChar方法的QueryParserTokenManager.cs里)。这里就不分析具体代码了,比较复杂。那我们有没有办法消除这个异常(这个异常是为调用此方法准备的)
下面先具体看下怎么消除异常:
QueryParser\FastCharStream.cs 中 Refill() 方法:






改为:



public char ReadChar()
{
if (bufferPosition >= bufferLength)
Refill();
if (bufferPosition < bufferLength)
return buffer[bufferPosition++];
}
{
if (bufferPosition >= bufferLength)
Refill();
if (bufferPosition < bufferLength)
return buffer[bufferPosition++];
}
修改成:









有一下代码:

try
{
curChar = input_stream.ReadChar();
}
catch (System.IO.IOException e)
{
return curPos;
}
根据修改的ReadChar()方法可以修改为:{
curChar = input_stream.ReadChar();
}
catch (System.IO.IOException e)
{
return curPos;
}
curChar = input_stream.ReadChar();
if (curChar == '\0')
return curPos;
可以把try...Catch移除了。if (curChar == '\0')
return curPos;
ok完工