Try-Catch Sanity Check

时间:2017-01-29 21:02:41

标签: c# entity-framework

我有一段代码,我已经将其包含在try-catch块中。我这样做是因为我没有得到我期望的结果。但是现在,我没有得到我期望的try-catch块的结果。

我的理解是执行try块中的代码。如果抛出异常,catch块会捕获它,然后代码继续运行。

我看到的是try块中抛出异常的代码。然后catch块捕获它,并向我发送一封异常ToString()的电子邮件。但是,try块中的代码会从中断处继续。我没想到它会在它停止的地方重新开始。我以为已经完成了。

以下是我正在做的一些psudo代码:

try 
{
    var context = New DbContext();

    for(var i = 0; i < 5; i++)
    {
        var records = ABunchOfRecordsThatIGather(OneHundredAtATime);

        foreach(var record in records)
        {
            context.Add(record);
        }

        context.SaveChanges();
        context.Dispose();

        context = New DbContext();
    }

    SendMeASuccessEmail();
}
catch (Exception ex)
{
    SendMeAnEmailOfTheException(ex.ToString());
}

我收到了各种错误(不同的问题),但其中一些错误是System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint,其中一些是A transport-level error has occurred when receiving results from the server错误。

无论如何,如果我在插入100条记录后收到错误(并且需要插入500条),我不希望在100之后看到错误(我有一个我自己发邮件的计数器),然后是成功电子邮件它结束了。但是,这就是我所看到的。我稍后会收到错误电子邮件和成功的电子邮件。

有人可以为我澄清这个吗?

修改
由于这些评论几乎完全脱离主题,我将编辑我的PSUDOcode,希望将其扼杀在萌芽状态。这是:

try
{
    DoSomeEntityFrameworkStuff();

    SendASuccessEmailIfAllIsWell();
}
catch
{
    SendAFailureEmailIfSomethingBadHappens();
}

1 个答案:

答案 0 :(得分:0)

代码在异常后不会从中断处继续。

基于你的psudo代码,我建议你可以检查3种可能性/事情:

  1. 是否存在异步调用,因此在代码执行了子行
  2. 后发生异常
  3. 您的发送成功电子邮件是否在for循环中,以便在程序完成之前收到该电子邮件
  4. 您是否有多个尝试Catch Blocks,在这种情况下,异常可能被内部尝试Catch Block“吞噬”。