即使已经处理,异常也被视为用户未处理

时间:2012-04-02 12:48:44

标签: visual-studio-2010 exception-handling unhandled-exception

简短版:

为什么Visual Studio告诉我代码抛出了用户未处理的异常,即使我抓住了异常?

更长的版本:

我正在使用实体框架和Microsoft's transient fault handling framework

我的实体框架类是部分的,我有自己的方法SaveChangesWithRetries我执行retry-logics:

public partial class EfContext
{
    public virtual void SaveChangesWithRetries()
    {
       var retryPolicy = RetryPolicyFactory.GetDefaultSqlCommandRetryPolicy();
       retryPolicy.ExecuteAction(() =>
                       {
                          SaveChanges();
                       });
    }
 }

使用此功能的代码可能如下所示:

try
{
    context.SaveChangesWithRetries();
}
catch (OptimisticConcurrencyException)
{
    continue;
}

即使我捕获了OptimisticConcurrencyException异常,Visual Studio也会停止调试器并告诉我对ExecuteAction()的调用引发了用户未处理的异常。发生这种情况时,调试器会在EfContext类中停止。如果按F10,调试器将移至catch(OptimisticConcurrencyException)。

我不明白为什么VS2010告诉我有一个用户未处理的异常,即使我有一个捕获,即使我的捕获捕获异常。

2 个答案:

答案 0 :(得分:1)

弄清楚导致这种情况的原因。

  1. 我们的代码启动了一个try / catch子句
  2. 我们的代码称为瞬态故障处理框架(TFHF)
  3. TFHF调用我们的代码(通过lambda expression9
  4. 我们的代码引发了异常
  5. 由于TFHF是在发布版本中构建的,因此.NET Framework不理解我们自己的代码在步骤0中捕获了异常,这是在步骤3中引发的。

答案 1 :(得分:0)

我有一个类似的问题,我需要一个异常来传播一些.NET代码,以便我可以在另一方面捕获它。我发现Debug> Exceptions对话框允许您选择希望VS打破的异常类型。对于每个Exception类型,您可以检查抛出异常时是否应该中断,或者只有在未处理时才会中断。所以,我所做的是选择一个深奥的异常类型,默认情况下取消选中“user-unhandled”,并包装我想用这种异常传播的异常。具体来说,我选择了AppDomainUnloadedException,因为它位于System.dll程序集中,因此已被我的项目引用。

这是我的代码,它包含了我需要传播的IOException:

public override int Read(byte[] buffer, int offset, int count)
{
    try { return innerStream.Read(buffer, offset, count); }
    catch (IOException ex) { throw new AppDomainUnloadedException("Exception from innerStream: " + ex.Message, ex); }
}

这是我的代码,我在它需要传播的.NET代码的另一端捕获它:

try { bytesRead = sslStream.Read(buffer, offset, count); }
catch (Exception ex) { /* ex handled here. */ }

问题解决了。当它抛出IOException时,VS不再在innerStream.Read上中断。