Lucene.net中的异常处理

问题提出:
最近有人提出在lucene.net中:
Throwing an exception as a result of a normal situation is extremely bad in .net
在QueryParser\FastCharStream.cs 中 Refill() 方法里有这么一段:
None.gif
None.gif
int  charsRead  =  input.Read(buffer, newPosition, buffer.Length  -  newPosition);
None.gif
if  (charsRead  <=   0 )
None.gif  
throw   new  System.IO.IOException( " read past eof " );
None.gif
else
None.gif  bufferLength 
+=  charsRead;
None.gif
问题解决:
我们知道,在net中捕捉异常是比较耗资源的。
这里有篇文章对异常做了性能分析和测试: Performance implications of Exceptions in .NET
初看代码,感觉比较奇怪,为什么要对charsRead做异常处理?是否可以改成这样:
None.gif int  charsRead  =  input.Read(buffer, newPosition, buffer.Length  -  newPosition);
None.gif
if  (charsRead  >   0 )
None.gif  bufferLength 
+=  charsRead;
单从代码上看是没有问题的,但放在整个lucene的环境里就有问题。这样会造成死循环。
为什么会造成死循环?此段异常处理干嘛用的?造成死循环的地方是在ReadChar()方法里(确切的说是调用ReadChar方法的QueryParserTokenManager.cs里)。 这里就不分析具体代码了,比较复杂。那我们有没有办法消除这个异常(这个异常是为调用此方法准备的)
下面先具体看下怎么消除异常:
QueryParser\FastCharStream.cs 中 Refill() 方法:
None.gif
None.gif
int  charsRead  =  input.Read(buffer, newPosition, buffer.Length  -  newPosition);
None.gif
if  (charsRead  <=   0 )
None.gif  
throw   new  System.IO.IOException( " read past eof " );
None.gif
else
None.gif  bufferLength 
+=  charsRead;

改为:
None.gif int  charsRead  =  input.Read(buffer, newPosition, buffer.Length  -  newPosition);
None.gif
if  (charsRead  >   0 )
None.gif  bufferLength 
+=  charsRead;
ReadChar()方法:
  public   char  ReadChar()
        {
            
if  (bufferPosition  >=  bufferLength)
                Refill();
            
if  (bufferPosition  <  bufferLength)
                
return  buffer[bufferPosition ++ ];
        }

修改成:
None.gif   public   char  ReadChar()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if (bufferPosition >= bufferLength)
InBlock.gif                Refill();
InBlock.gif            
if (bufferPosition < bufferLength)
InBlock.gif                
return buffer[bufferPosition++];
InBlock.gif            
else//增加的,为了调用ReadChar()方法消除异常
InBlock.gif
                return '\0';
ExpandedBlockEnd.gif        }
在QueryParser\QueryParserTokenManager.cs 中查找ReadChar()方法( 有多个):
有一下代码: 13.gif也许你明白了
  try
   {
       curChar 
=  input_stream.ReadChar();
   }
   
catch  (System.IO.IOException e)
    {
          
return  curPos;
    }
根据修改的ReadChar()方法可以修改为:
 curChar  =  input_stream.ReadChar();
  
if  (curChar  ==   ' \0 ' )
        
return  curPos;
可以把try...Catch移除了。

ok完工

转载于:https://www.cnblogs.com/try/archive/2006/07/25/458983.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值