2014-12-17 5 views
0

В приложении ASP.NET типичный код обработки ошибок включает some variation of GetLastError(), однако есть также коллекция HttpContext.AllErrors, из которой метод GetLastError() извлекает только первый. Каковы сценарии, в которых коллекция AllErrors может содержать более одного исключения? Я ничего не могу придумать, но, очевидно, это так ...Когда HttpContext.AllErrors содержит более одного исключения?

ответ

1

ASP.NET Framework поддерживает другую модель, в которой запрос может иметь множество ошибок, все из которых могут быть отправлены без остановки обработки запроса, что позволяет более тонкую и полезную информацию, которая будет представлена ​​пользователю.

namespace ErrorHandling 
{ 
    // sample class adding errors to HttpContext 
    public partial class SumControl : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (IsPostBack) 
      { 
       int? first = GetIntValue("first"); 
       int? second = GetIntValue("second"); 
       if (first.HasValue && second.HasValue) 
       { 
        //result.InnerText = (first.Value + second.Value).ToString(); 
        //resultPlaceholder.Visible = true; 
       } 
       else 
       { 
        Context.AddError(new Exception("Cannot perform calculation")); 
       } 
      } 
     } 

     private int? GetIntValue(string name) 
     { 
      int value; 
      if (Request[name] == null) 
      { 
       Context.AddError(new ArgumentNullException(name)); 
       return null; 
      } 
      else if (!int.TryParse(Request[name], out value)) 
      { 
       Context.AddError(new ArgumentOutOfRangeException(name)); 
       return null; 
      } 
      return value; 
     } 
    } 
} 
// intercepting the errors 
public class Global : System.Web.HttpApplication 
{ 
    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     if (Context.AllErrors != null && Context.AllErrors.Length > 1) 
     { 
      Response.ClearHeaders(); 
      Response.ClearContent(); 
      Response.StatusCode = 200; 
      Server.Execute("/MultipleErrors.aspx"); 
      Context.ClearError(); 
     } 
    } 
} 
// MultipleErrors code behind 
public partial class MultipleErrors : System.Web.UI.Page 
{ 
    public IEnumerable<string> GetErrorMessages() 
    { 
     return Context.AllErrors.Select(e => e.Message); 
    } 
} 

Ответ сильно ссылки про asp.net 4.5 из appress

+0

Хм, но тогда появится только в моем собственном коде (и если я не делаю это, я не нужен беспокоиться об этом). Сам ASP.NET этого не делает? –

+0

, которые объясняют вещи далее, я думаю: обратите внимание, что мы вызываем метод HttpContext.ClearError после того, как мы сгенерировали нашу страницу ошибок. Вызов метода AddError не вызывает событие Error, но он вызывает встроенную поддержку обработки ошибок ASP.NET, которую мы настроили в файле Web.config ранее в этой главе. Если мы не вызываем ClearError, наша страница с несколькими ошибками будет заменена на тем, что указывает файл Web.config. – sarepta

+0

Разве это не пошло бы в 'ModelState'? –