ASP.NET MVC:获取在重新抛出的catch块中停止的未处理异常

时间:2015-11-20 17:18:31

标签: asp.net asp.net-mvc try-catch unhandled-exception rethrow

我在try / catch-rethrow代码块中看到了一些奇怪的行为。

我有一个实例化ClientGet类的方法,并从该类中获取Result值。

public Task<T> Get<T>(ClientRequest<T> Request)
    {
        try
        {
            return new ClientGet<T>(UpdateRequest(Request)).Result;
        }
        catch (Exception)
        {
            throw;
        }
    }

ClientGet类如下所示:

public class ClientGet<T> : IClientAction<T>
{
    public Task<T> Result { get; set; }

    public ClientGet(ClientRequest<T> request)
    {
        try
        {
            Result = GetResult(request);
        }
        catch (Exception)
        {
            throw;
        }
    }

    private async Task<T> GetResult(ClientRequest<T> request)
    {
        if (string.IsNullOrEmpty(request.FullPath))
        {
            throw new ApplicationException("You must specify a path in your request.");
        }
        try
        {
            using (HttpClient client = new HttpClient())
            {
                if (!string.IsNullOrEmpty(request.Settings.Token)) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", request.Settings.Token); }

                var response = await client.GetAsync(request.FullPath);
                if (response.IsSuccessStatusCode)
                {
                    return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync());
                }
                throw new HttpRequestException((int)response.StatusCode + ": " + response.ReasonPhrase);
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

如果response.IsSuccessStatusCode为false,则由于某种原因,代码在我的GetResult方法的catch处停止,并在我的throw上将其作为ASP.NET Unhandled Exception错误发布;线。我有所有的重新抛出,以便错误可以传递回应用程序的更高级别的原始调用者。

以下是我收到的确切消息:

  

401:未经授权     描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详情:System.Net.Http.HttpRequestException:401:未经授权

     

来源错误:

Line 45:             catch (Exception)
Line 46:             {
Line 47:                 throw;
Line 48:             }
Line 49:         }

1 个答案:

答案 0 :(得分:0)

不确定您预计会发生什么。听起来像代码正在做它应该做的事情。如果条件不满意,它会进入新的下一行,你抛出HttpRequestException,因为这都包含在try-catch中,该异常被捕获,然后重新抛出。但是,这是第一次允许异常冒泡,因此这是Visual Studio将指示源自异常的位置。它最终将被调用方法的try-catch捕获,然后在它再次被抛出后最终被提升到未被捕获状态。

但是,你在这里打破了使用try-catch的基本规则:如果你打算实际处理它,只能捕获异常。如果你要做的就是把它扔进catch块,那么整个try-catch都是没有意义的。默认行为是允许它在堆栈中冒泡;你不必明确地抛出它来实现它。