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

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

Давайте посмотрим на простом примере, как он выглядит.

Как видим, трассировка стека показывает нам путь выполнения программы от метода Main до метода MethodC, где произошла ошибка. Эта информация значительно облегчает поиск и устранение проблем в коде.

Но что если мы просто пробросим наше исключение дальше с помощью throw, поймаем на уровне метода A и пробросим в Main на этот раз используя throw ex?

Как видим, наша трассировка стэка очистилась до уровня Method A.

Здесь произошло следующее. Когда мы вызвали throw без объекта исключения, то он просто пробросил исключение стеку выше (метод A). Но стоило нам пробросить с A выше до Main, то стек очистился, и именно из за того, что мы использовали throw ex, данная операция стек очистила, и теперь исключение будто говорит нам, что возникла она именно на уровне метода A.

Прекрасно, мы узнали/вспомнили трассировку стека и способы “подбрасывания” ошибок, а теперь давайте обсудим касаемо их сокрытия.

Хоть в кастомных, хоть в исключениях “из под коробки”, в них, мы можем сокрыть сообщения об ошибках, и очистить трассировку стека. Так же можно завуалировать ошибку определенным кодом/шифром, непосредственно связанным с, допустим, внутренней документацией продукта.

но, зачем?

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

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

Итог

Это краткое дополнение к предыдущему посту напомнило нам о тонкости throw и throw ex, а так же о том, что бывают ситуации, когда исключения на уровне пользователя - не всегда хорошо.

А на сегодня все. До новых встреч!