Обработка исключений с помощью HttpModule

Есть два быстрых шага, чтобы сделать эту работу именно так, как вы хотите:

Сначала , измените ваш вид с Button на TextView и примените ваш rounded-button.xml фон. Это должно работать мгновенно. Немного сложно установить фон для кнопки, как показано здесь .

Во-вторых, , я заметил, что в вашем файле rounded-button.xml нет элемента solid. Сплошной элемент позволяет установить фон макета. По этой причине я изменил один из ваших элементов stroke на элемент solid (в любом случае не должно быть двух элементов stroke). Обновленный код rounded_button.xml показан ниже:

PS: не забудьте изменить представление в activity_main.xml с Button на TextView! [ 1110]



    
    

    
    

    
    


Надеюсь, это поможет. Веселого кодирования!

5
задан alexandrul 25 May 2009 в 05:57
поделиться

6 ответов

Never1 catch (Exception ex). Period2. Нет никакого способа, которым можно обработать все различные виды ошибок, которые можно зафиксировать.

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

Несколько причин этого, от вершины моей головы:

  • Ловля и перебросок являются дорогими
  • Вы закончите тем, что теряли отслеживание стека
  • У Вас будет низкое signal-to-noice отношение в Вашем коде

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

Для обрабатывания исключений, которые не пойманы прислушайтесь к соответствующим событиям. При выполнении WinForms необходимо будет прислушаться System.AppDomain.CurrentDomain.UnhandledException, и - если Ваше выполнение Threading - System.Windows.Forms.Application.ThreadException. Для веб-приложений существуют подобные механизмы (System.Web.HttpApplication.Error).

Что касается переносящихся исключений платформы в Вашем приложении (не-) определенные исключения (т.е. throw new MyBaseException(ex);): Совершенно бессмысленный, и плохой запах 4


Править

1 Никогда не очень резкое слово, особенно когда дело доходит до разработки, как @Chris указанный в комментариях. Я признаюсь, что был высок на принципах, когда я сначала записал этот ответ.

2,3 См. 1.

4, Если Вы не приносите ничего нового для таблицы, я все еще поддерживаю это. Если Вы поймали Exception ex поскольку часть метода, который Вы знаете, могла перестать работать в любом количестве путей, я полагаю, что существующий метод должен отразить, что в он - подпись. И как Вы знаете, исключения не часть сигнатуры метода.

10
ответ дан 18 December 2019 в 13:21
поделиться

Если бы я читаю вопрос правильно, я сказал бы, что, реализовывая попытку / выгода, которые прерывают исключения (Вы не упоминаете - он ловит все исключения или просто определенное?) и выдает другое исключение, обычно плохая вещь.

Недостатки:

По крайней мере Вы потеряете информацию трассировки стека - стек, который Вы будете видеть, только расширится на метод, в котором выдается новое исключение - Вы потенциально теряете некоторую хорошую информацию об отладке здесь.

При ловле Исключения Вы рискуете маскировать критические исключения, как OutOfMemory или StackOverflow за менее критическим исключением, и таким образом оставлять выполнение процесса, где, возможно, это должно было быть разъединено.

Возможные преимущества:

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

Однако почти во всех случаях это - неприятный запах и должно использоваться с осторожностью.

Обычно необходимо только поймать исключение, когда существует что-то реалистическое, которое можно сделать в том месте - т.е. восстановление, откат, идя в план B и т.д. Если нет ничего, что можно делать с этим, просто позволить этому отказываться от цепочки. Необходимо только поймать и выдать новое исключение, если существуют определенные и полезные доступные данные в том месте, которое может увеличить исходное исключение и следовательно помочь отладке.

2
ответ дан 18 December 2019 в 13:21
поделиться

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

Вот интересное сообщение о том, как использовать HttpModule для обрабатывания исключений: http://blogs.msdn.com/rahulso/archive/2008/07/13/how-to-use-httpmodules-to-troubleshoot-your-asp-net-application.aspx и http://blogs.msdn.com/rahulso/archive/2008/07/18/asp-net-how-to-write-error-messages-into-a-text-file-using-a-simple-httpmodule.aspx

1
ответ дан 18 December 2019 в 13:21
поделиться

Выезд ELMAH. Это делает то, о чем Вы говорите. Очень хорошо.

Когда я создаю библиотеки, я пытаюсь всегда обеспечить сокращенное количество исключений для вызывающих сторон для обработки. Например, думайте о Компоненте репозитория, который соединяется с sql базой данных. Существуют ТОННЫ исключений от sql клиентских исключений до недопустимых исключений броска, которые могут теоретически быть выданы. Многие из них ясно документируются и могут составляться во время компиляции. Так, я ловлю столько из них, сколько я, разместите их в единственный тип исключительной ситуации, может заявить RepositoryException и позволить тому исключению свернуть стек вызовов.

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

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

1
ответ дан 18 December 2019 в 13:21
поделиться

Походит на исключение, которое выдается, не должен был быть реализован как исключение.

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

Я использовал бы HttpModule только, когда я не мог добраться немного ближе туда, где исключения на самом деле происходят в коде. Вы действительно не хотите событие HttModule OnError, которое является гигантским оператором переключения в зависимости от информации об ошибке BaseApplicationexception.

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

0
ответ дан 18 December 2019 в 13:21
поделиться

На основе моего опыта поймайте исключение, добавьте ошибку к объекту Сервера (?). Это позволит.NET делать то, что когда-либо она должна сделать, затем отобразить Ваше исключение.

0
ответ дан 18 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: