【问题标题】:Catching exceptions with BeginRead in C#在 C# 中使用 BeginRead 捕获异常
【发布时间】:2011-03-20 11:04:37
【问题描述】:

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

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

或者换一种说法,我是否也应该在 BeginRead 后面加上 try{}catch{}?

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.
    }
}

【问题讨论】:

    标签: c# winforms exception-handling asynchronous


    【解决方案1】:

    一个简单的证明:

    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);
    }
    

    所以是的,您应该在此处预测例外情况。

    【讨论】:

    • 感谢您的回答。请参阅我对 Marc 的评论。
    • @Andy 是的,我同意大多数情况都无关紧要。这里要担心的一件事是Stream。如果它不是 null 但不知何故无效,异常会发生在 BeginRead 还是 EndRead 中? (我不知道)。
    【解决方案2】:

    好吧,任何代码都可以抛出异常,所以“从不”是强...例如,OutOfMemoryExceptionThreadAbortException,或者其他一些指示资源饱和的异常(例如,它不知何故无法启动异步操作)。

    可能(虽然我还没有测试过)如果那是一个只写流,也会立即抛出。如果stream 变成null,它肯定会立即抛出。

    但是!在我提到的所有情况下,正确的行为可能是让它冒泡;它们都表明与当前逻辑无关的非常基本的问题。所以不:我不会在这里try/catch 除非有我期望并想以某种方式处理的特定

    【讨论】:

    • 我认为“从不”会产生意见 :) 发布的代码只是解释我的问题的框架,所以,假设我对传递给 BeginXXX 的参数进行了适当的检查,任何异常都不会特定于调用本身,而是针对整个应用程序?
    • @Andy - 与读取数据相关的异常应该来自EndXXX。 “Braindead 异常”(参见 Eric Lippert 的博客)或病态进程异常可能来自任何地方。
    • 谢谢。 +1 仅用于“Braindead 异常”参考!
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多