Исключения: Throw vs Throw ex, а так же сокрытие.
Еще немного об исключениях, на этот раз коснемся отладки и диагностики ошибок, вспомним для начала, что такое трассировка стека.
Трассировка стека – это последовательность вызовов методов, которая показывает
путь выполнения программы от начала до текущей точки. Она содержит информацию о
каждом вызванном методе, включая его имя, пространство имен, номер строки в
исходном коде и другие данные. Эта информация крайне полезна при отладке, так как
позволяет выявить источник ошибки и понять, как именно программа дошла до него.
Давайте посмотрим на простом примере, как он выглядит.
Как видим, трассировка стека показывает нам путь выполнения программы от метода Main
до метода MethodC
, где произошла ошибка. Эта информация значительно облегчает поиск и устранение проблем в коде.
Но что если мы просто пробросим наше исключение дальше с помощью throw
, поймаем на уровне метода A
и пробросим в Main на этот раз используя throw ex
?
Как видим, наша трассировка стэка очистилась до уровня Method A
.
Здесь произошло следующее.
Когда мы вызвали throw без объекта исключения, то он просто пробросил исключение стеку выше (метод A
). Но стоило нам пробросить с A
выше до Main, то стек очистился, и именно из за того, что мы использовали throw ex
, данная операция стек очистила, и теперь исключение будто говорит нам, что возникла она именно на уровне метода A
.
Прекрасно, мы узнали/вспомнили трассировку стека и способы “подбрасывания” ошибок, а теперь давайте обсудим касаемо их сокрытия.
Хоть в кастомных, хоть в исключениях “из под коробки”, в них, мы можем сокрыть сообщения об ошибках, и очистить трассировку стека. Так же можно завуалировать ошибку определенным кодом/шифром, непосредственно связанным с, допустим, внутренней документацией продукта.
но, зачем?
Ну, во первых мы, скрывая трассировку стека, так же ограничиваем доступ к системной информации, которая может быть использована нехорошими людьми для банального взлома.
Во вторых, пользователю не зачем знать подробностей ошибки, он обязан связаться с технической поддержкой, объяснить ситуацию, код ошибки и шаги, которые привели к этой проблеме.
Итог
Это краткое дополнение к предыдущему посту напомнило нам о тонкости throw и throw ex, а так же о том, что бывают ситуации, когда исключения на уровне пользователя - не всегда хорошо.
А на сегодня все. До новых встреч!