1

如果用户的上传时间超过 15 分钟,我们有一个图片上传页面会超时。

我们正在捕获超时发生的 HttpException。但是我们怎么知道异常是因为超时而发生的,所以我们可以返回一个特定的消息呢?

我们的代码:

try
{
    // do stuff here
}
catch (HttpException ex)
{
    // What can we check to know if this is a timeout exception?
    // if (ex == TimeOutError)
    // {
    //      return "Took too long. Please upload a smaller image.";
    // }
    return "Error with image. Try again.";
}
catch (Exception ex)
{
    return "Error with image. Try again.";
}

超时错误是什么样的:

System.Web.HttpException (0x80004005): Request timed out.
at System.Web.HttpRequest.GetEntireRawContent()
at System.Web.HttpRequest.GetMultipartContent()
at System.Web.HttpRequest.FillInFormCollection()
at System.Web.HttpRequest.EnsureForm()
at System.Web.HttpRequest.get_Form()
at MyStore.upload.ProcessRequest(HttpContext context) 

ex.ErrorCode=-2147467259
ex.GetHttpCode=500
ex.WebEventCode=0

我不愿简单地做一个if比较上面错误代码的语句。

HttpCode500似乎是一个通用Internal Server Error代码,它可能发生的不仅仅是超时异常。

ErrorCode-2147467259是我不熟悉的东西。如果该数字对于超时错误将保持不变,并且永远不会发生非超时异常,那么我可以if对这个数字进行比较。

我认为必须有一种简单的方法来知道是否HttpException是超时异常,例如:

if (ex == TimeoutError) // what should this be?

更新:

我刚刚尝试捕捉TimeoutException,如下所示,但它仍然只被HttpException.

try
{
    // do stuff here
}
catch (TimeoutException ex)
{
    // Timeout doesn't get caught. Must be a different type of timeout.
    // So far, timeout is only caught by HttpException.
    return "Took too long. Please upload a smaller image.";
}
catch (HttpException ex)
{
    // What can we check to know if this is a timeout exception?
    // if (ex == TimeOutError)
    // {
    //      return "Took too long. Please upload a smaller image.";
    // }
    return "Error with image. Try again.";
}
catch (Exception ex)
{
    return "Error with image. Try again.";
}
4

2 回答 2

0

您可以通过以下方式捕获几个超时条件:

    bool IsTimeout(HttpException httpex)
    {

        switch ((HttpStatusCode)httpex.GetHttpCode())
        {
            case HttpStatusCode.RequestTimeout:    //408
            case HttpStatusCode.GatewayTimeout:   //504
                return true;
            default: return false;
        }
    }
于 2022-02-08T20:48:43.550 回答
-1

你需要使用

ex.getType() is subClassException

因为 TimeoutException 是一个子类。如果它是一个可能的抛出,那将是如何捕捉那种类型的执行......

虽然,httpexpection 总是会被抛出,即使它确实超时(参考https://msdn.microsoft.com/en-us/library/system.web.httprequest(v=vs.110).aspx 从每个方法抛出的内容)。所以你需要做类似的事情,

if(e.Message.Contains("timed out"))
   //Do something because it timed out
于 2015-11-05T18:18:30.073 回答