代码之家  ›  专栏  ›  技术社区  ›  Andy

用C语言捕获BeginRead异常#

  •  3
  • Andy  · 技术社区  · 14 年前

    当使用BeginXXX/EndXXX模式使用异步代码从流中读取数据时,我相信在调用EndXXX时会抛出任何在该过程中发生的异常。

    这是否意味着对BeginXXX的初始调用永远不会抛出异常,它总是由EndXXX抛出?

    或者换一种说法,

    public StartReading()
    {
            // Should this be enclosed with try{}catch{} ?
            stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(readCallback), stream);
    }
    
    private void readCallback(IAsyncResult result)
    {
        Stream stream = (Stream)result.AsyncState;
    
        try
        {
            int len = stream.EndRead(result);
    
            // Do work...
    
        }
        catch(Exception ex)
        {
            // Error handling stuff.
        }
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Marc Gravell    14 年前

    好, 代码可以抛出异常,所以“从不”很强。。。例如, OutOfMemoryException , ThreadAbortException ,或其他表示资源饱和的异常(例如,它无法启动异步操作)。

    可以 (虽然我还没有测试)也扔 立即 当然 stream 结果是 null .

    try / catch 除非有什么事 具体的 我期待并想处理好。

        2
  •  1
  •   Henk Holterman    14 年前

    一个简单的证明:

    public StartReading()
    {      
        // Should this be enclosed with try{}catch{} ?
        buffer = null; // now it will throw
        stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(readCallback), stream);
    }
    

    所以是的,你应该预料到这里的例外情况。