2016-07-10 3 views
8

Я пытаюсь запустить приложение ASP.NET, которое регистрирует исключения в базе данных. Я использую Application_Error, чтобы поймать исключение.Application_Error() not firing

Перед добавлением строки подключения, чтобы проверить мой код (класс Logger и код в Global.asax), я попытался зарегистрировать ошибку в средстве просмотра событий Windows. Это работает так, как ожидалось.

Но после добавления строки подключения в файл Web.config и добавления кода ADO.NET я попытался запустить приложение. Но я получаю желтый экран смерти: D

Я не знаю, что не так с моим кодом. Я только модифицировал элемент connectionStrings в файле Web.config и добавил код ADO.NET.

Вот код.

Это код веб-формы в событии Page_Load. Файл Countries.xml отсутствует, и ожидается, что он вызовет ошибку.

DataSet dataset = new DataSet(); 
dataset.ReadXml(Server.MapPath("~/Countries.xml")); 
GridView1.DataSource = dataset; 
GridView1.DataBind(); 

Application_Error

Exception exception = Server.GetLastError(); 
if (exception != null) 
{ 
Logger.Log(exception); 
Server.ClearError(); 
Server.Transfer("~/Errors.aspx"); 
} 

Web.config

<configuration> 
<connectionStrings> 
    <add name="DBCS" connectionString="Data Source=.;database=Sample;Integrated Security=SSPI" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
<system.web> 
<compilation debug="true" targetFramework="4.5.2" /> 
</system.web> 
</configuration> 

Я пытался отладки, помещая точку останова в методе Application_Error в Global.asax, но управление никогда не доходит до этой точки. Исключение запускается из события Page_Load. Ошибок компиляции в коде класса Logger нет. Кроме того, я не хочу использовать маршрут customErrors для решения этой проблемы.

Заранее спасибо.

Это ссылка на код: https://drive.google.com/folderview?id=0B5K22Q9r50wXU0VOQmJKVHBoaDg&usp=sharing

+0

Вы реализующий страницу ошибки тоже? Вы подтвердили, что у вас нет других утверждений try-catch, которые, возможно, попали в исключение раньше вашего кода Application_Error? –

+0

Привет @Ephraim, да, я реализую страницу пользовательской ошибки: Errors.aspx. В моем коде нет другого блока catch catch. Исключение не обрабатывается, и я вижу желтый экран смерти. – Nachiket

ответ

0

Разрешены вы пользовательские ошибки на web.config?

<system.web> 
    ... 
    <customErrors mode="RemoteOnly" defaultRedirect="~/Errors.aspx" redirectMode="ResponseRewrite" /> 
    ... 
</system.web> 

Обратите внимание, что режим редирект «ResponseRewrite» в-целях сохранения Server.GetLastError() исключения. Если вы установите это в противном случае, то Server.GetLastError() вернет значение null.

Внедрение Application_Error должно быть легко .. в Global.asax

protected void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (ex is ThreadAbortException) 
     return; // Redirects may cause this exception.. 
    Logger.Error(LoggerType.Global, ex, "Exception"); 
    Response.Redirect("unexpectederror.htm"); 
} 

UPDATE:

Возможный виновник будет быть HandlerErrorAttribute зарегистрирован в качестве фильтра на Global.asax.

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); // this line is the culprit 
} 

Просто закомментировать или удалить строку и убедитесь, что вы реализовали CustomErrors в system.web под web.config.

Я не знаком с HandleErrorAttribute, если это разрешит вашу проблему, тогда вы можете также просмотреть свою документацию.

+0

Привет @Ephraim, вы подходите, и это поможет мне поймать исключение. Но тогда, что не так с кодом и подходом, который я использую, мой вопрос. Приложение_Error должно запускаться, если исключение не обрабатывается с помощью блока try-catch или на уровне страницы. Так почему же это не работает? – Nachiket

+0

@ Nachiket Я обновил свой ответ. Вероятно, ваша подпись метода для Application_Error некорректна. Я привел пример. –

+0

Нет такой же подписи метода. Я попробовал ваш код. Но элемент управления не достигнет метода Application_Error. Я даже изменил значение режима customErrors с remoteOnly на on, но все равно никаких изменений. Я имею в виду, что я перенаправлен на страницу Errors.aspx, но Application_Error не запускается. – Nachiket

1

Если у вас есть <customErrors mode="Off" /> в то время как отладки, код не дойдет до Application_Error события, поскольку исключение отображается в браузере сразу.

Если вы хотите достичь Application_Error во время отладки, вы хотите включить пользовательскую ошибку -

<customErrors mode="On" defaultRedirect="~/Error.aspx" /> 
+1

Привет @Win, я попробовал это. Но элемент управления никогда не достигает метода Application_Error. Хотя я действительно перенаправляюсь на страницу Errors.aspx – Nachiket

+1

yep, что это за приложение Application_Error, тогда – Toolkit