ASP.NET Exception Обработка презентации для пользователя - PullRequest
1 голос
/ 09 февраля 2012

Я добавил на свой сайт попытку отлова, которая отлично работает.Следующая часть в разработке должна установить некоторый вывод обработки исключений.Очевидно, я не хочу, чтобы сайт рушился при возникновении ошибки, и мне не нужен ужасный экран ошибок.Так что где-то посередине было бы неплохо.Я думал о том, чтобы на главной главной странице был пользовательский элемент управления обработчиком исключений, который будет выводить приятное небольшое сообщение, когда что-то пойдет не так.Как лучше всего передать исключение этому пользовательскому элементу управления?Я думал об использовании переменной сеанса.

У кого-нибудь есть решение этой проблемы?

Спасибо

Ответы [ 2 ]

5 голосов
/ 09 февраля 2012

Это проще, чем вы делаете. Создайте страницу с именем error.aspx (или как вы хотите ее называть) и включите CustomErrors в web.config.

<configuration>
  <system.web>
    <customErrors defaultRedirect="errors.aspx"
                  mode="On">
    </customErrors>
  </system.web>
</configuration>

Существует множество конфигураций для обработки различных ошибок http или случайных исключений. Если вы хотите, вы можете сбросить сообщение об исключении (или само исключение) в сеанс или использовать HttpServerUtility.GetLastError ( документация ), а затем вывести любое количество различных сообщений на странице ошибок. Это даже поймает исключения, которые вы не поймаете.

Документация по пользовательским ошибкам

Редактировать:
@Icarus указывает, что OP ищет решение, с помощью которого страница продолжает отображаться и выводиться, показывая только сообщение об ошибке на странице, поэтому я также предоставлю ответ.

Есть несколько способов, которыми я справился с этим в прошлом. Для очень сложных страниц, где запрашиваемое поведение является фатальным (результат страницы не может быть известен), я всегда ссылаюсь на страницу с ошибкой, как я упоминал выше, которая включает основные главные элементы. Таким образом, меню, заголовок и т. Д. Все еще там, но уведомление о катаклизме очевидно.

Поведение, которое вы, похоже, ищете, я бы использовал не столько из-за необходимости сообщать об исключениях, сколько из общих сообщений. Я предпочитаю, чтобы пользовательский элемент управления имел общедоступное свойство, в которое можно вставить сообщение. Например (простите за VB, я не могу найти свою версию C #):

<BrowsableAttribute(True), Bindable(False), Category("Misc"), _
    Description("Gets or sets the NavigateUrl property for the link to start a new request.")> _
Public Property MyImportantMessage() As String
    Get
        Return _myImportantMessage
    End Get
    Set(ByVal value As String)
        _myImportantMessage= value
    End Set
End Property

Тогда выводом может быть любое понравившееся вам строковое сообщение, или вы можете запрограммировать несколько пресетов, извлекать из ресурсов и так далее. Что касается того, как туда попасть, мы выбрали маршрут MasterPage. У нас на главных страницах есть метод, который назначает такое свойство непосредственно в пользовательском элементе управления. Чтобы этот метод мог вызываться, каждая страница, использующая главную страницу, должна включать свойство VirtualPath, иначе метод не будет доступен во время компиляции.

<%@ MasterType 
    VirtualPath="~/MasterPage.master" %>

Это позволяет затем вызывать свойство Master на самой странице для вызова этого свойства:

'Keeping the VB theme
Me.Master.SetImportantMessage(message)

Имейте в виду, что Me.Master изнутри страницы не совпадает с Page.Master. Таким образом, ваше исключение либо должно всплыть на фактической странице, либо сама ссылка на страницу должна быть отправлена ​​в ваш пользовательский контроль как свойство.

0 голосов
/ 09 февраля 2012

Если вы хотите указать ошибку для обработанного исключения, это на самом деле так же просто, как заполнить метку каким-то уведомлением о том, что в приложении возникла проблема при обработке запроса. Вы сделаете это в части «catch» оператора. Я даже дошел до того, что представлял разные сообщения в зависимости от роли пользователя. Например, если администратор сгенерирует ошибку, вы можете фактически вывести фактическое сообщение об исключении, но если кто-то с меньшей ролью сгенерирует его, это покажет ему более общую ошибку и отправит группе администраторов сообщение / электронное письмо.

try
{
  //your code here
}
catch (Exception ex)
{
  if (Role!="Admin")
  {
    Label1.Text = "There was an error, the administrator has been notified."
  }
  else
  {
    Label1.Text = "Error: " + ex.Message + ": " + ex.StackTrace; //you could add further here if you want to look for an inner exception.
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...