2015-02-27 3 views
0

Global.asax.cs:Исключение прекращает работу в ASP.NET MVC

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas();  
    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    GlobalFilters.Filters.Add(new HandleErrorAttribute()); // i added this 
} 

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    Response.Clear(); 

    HttpException httpException = exception as HttpException; 

    if (httpException != null 
    { 
     string action; 
     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       // page not found 
       action = "HttpError404";      
       break; 
      case 500: 
       // server error 
       action = "HttpError500"; 
       break; 
      default: 
       action = "General"; 
       break; 
     } 
    } 

    // clear error on server 
    Server.ClearError(); 

    //return new EmptyResult(); 
} 

Действие:

public ActionResult Index() 
{ 
    var a = Convert.ToInt64(""); // I get exception after that project is not running 

    return view(); 
} 

Вопрос:

Пытаюсь использовать динамическое исключение в asp.net MVC. Чтобы сделать это, я добавил метод в global.asax.cs. Обработка исключений работает, однако проект не запускается после возникновения исключения.

Когда я получаю исключение, я хочу, чтобы проект продолжал работать, например, при использовании инструкции try-catch. Однако, когда я получаю исключение, проект перестает работать.

Что нужно добавить или что изменить для продолжения разработки проекта?

ответ

5

Резюме:

Application_Error не обрабатывает исключения типа ваш код метания и даже если ты ничего не вернуть.

деталь:

Вы пытаетесь использовать два различных аспекта обработки исключений в ASP.NET MVC.

Если вы зарегистрировали HandlerErrorAttribute в GlobalFilters, то вы говорите, что для любой неперехваченной ошибки вы хотите перенаправить на страницу ошибок приложения, которая по умолчанию будет найдена в /Views/SharedFolder.

Но это работает только если CustomErrors = «On» в web.config:

<system.web> 
    <customErrors mode="On" /> 
</system.web> 

Обратите внимание, что вы можете также применить HandlerErrorAttribute на контроллере или на уровне ActionMethod, а не на глобальном уровне.

Если CustomErrors = «On» но не имеют страницы ошибок определены в /Views/SharedFolder то кинет усугубляются ошибку типа System.InvalidOperationException, который, в свою очередь пузырек до Application_Error.

Если, с другой стороны, customErrors = "Off", то механика HandleErrorAttribute не будет срабатывать, и вместо этого исключение, вызванное вашим указателем ActionMethod, будет пузыриться до обработчика GlobalError, который вы определили в Application_Error.

В этом случае исключение будет относиться к коду:

var a = Convert.ToInt64(""); 

Это будет сгенерировано исключение типа System.InvalidFormatException.

Так что, если вы установите контрольную точку в Application_Error вы увидите, что этот метод не работать, но это обыкновение фактически делать что-либо, потому что ваши заявления переключатель только предполагая HttpException:

HttpException httpException = exception as HttpException; 
if (httpException != null) 

HttpException всегда будет нулевым под этим обстоятельства, потому что ни System.InvalidOperationException, ни System.InvalidFormatException унаследовать от HttpException.

Таким образом, вы должны делать что-то подобное:

HttpException httpException = exception as HttpException; 

if (httpException == null) 
{ 
    // General exception handling logic here 
} 
else    
{ 
    // Http exception handling switch statement here    
} 

Это говорит, даже если вы правильно поймать и обработать ошибку, вы не делаете ничего с ним или после него:

//return new EmptyResult(); 

Итак, вы все равно получите пустую страницу. Вы должны сделать Redirect или Server.Transfer или что-то на этом этапе.

0

Когда возникает исключение, оно передается через стек вызовов до тех пор, пока оно не будет обнаружено. Если он не пойман, приложение перестает работать.

Здесь вы не пытаетесь поймать свое исключение, поэтому ваше приложение перестает работать.

Все, что вам нужно, это что:

public ActionResult Index() 
{ 
    try 
    { 
     var a = Convert.ToInt64(""); 
    } 
    catch (YourExceptionType ex) 
    { 
     // Do something 
    } 

    return view(); 
} 

Но вы также можете использовать TryParse метод, который позволит избежать использования механизма исключения, который является довольно тяжелой вещью.

Также помните, что выгода исключения означает, что вы знаете, что делать, чтобы ваше приложение находилось в стабильном состоянии, даже если это исключение поднято.

+0

Как я могу использовать try catch dynamic (только 1 попытка поймать во всех проектах)? – Soner

+0

Это то, что механизм asp.net позволяет вам использовать метод обработки ошибок. Но это означает, что приложение останавливается там, где была поднята ошибка. Это позволяет вам делать действия для отображения различных результатов для пользователя в зависимости от ошибки, которую вы обрабатывали, а не для продолжения выполнения следующей инструкции – ppetrov

+0

. Вы имеете в виду, что вы не можете использовать try catch один раз для всего проекта в .net или что вы предлагаете использовать? – Soner

Смежные вопросы