проверено и не проверено исключение в .NET - PullRequest
4 голосов
/ 21 сентября 2010

странная идея приходит ко мне, когда я читаю APUE (Расширенное программирование в среде UNIX).

Кажется, что в обработке ошибок UNIX есть два типа ошибок (FATAL и INFATAL).Я чувствую, что это что-то, связанное с проверенными и непроверенными исключениями в JAVA.

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

Я слышал, что в C # нет проверенного и непроверенного исключения, поэтому в C # нет понятия критических и некритических ошибок?Просто стало очень любопытно, потому что я думаю, что эта концепция очень фундаментальная.

Обновление: Что такое дизайн исключений в других языках?Кто-нибудь может поговорить об этом?

Ответы [ 6 ]

8 голосов
/ 21 сентября 2010

В Java отмеченные и непроверенные исключения не точно соответствуют фатальной или нефатальной ошибке. Проверенное исключение явно указывает, что исключение может быть сгенерировано, и кто-то должен его перехватить (чтобы попытаться обработать или выбросить его в стек), но нет гарантии, что ошибка не может быть фатальной (то есть синтаксическая ошибка в Запрос SQL выдаст исключение SQLException и, вероятно, будет фатальным, но это проверенное исключение). Непроверенное исключение просто означает, что кому-то не нужно его перехватывать, но вы все равно можете, если хотите. Обычно это указывает на ошибку программирования. Ошибки Java обычно указывают на вещи, которые являются неисправимыми проблемами (такими как OutOfMemoryError).

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

2 голосов
/ 10 июля 2016

ИМХО компилятор c #, встроенный в атрибут класса исключения, такой как [CriticalException] против [NonCriticalException], был бы хорош. Если вы украсите свой класс исключений этим атрибутом или (MS в среде выполнения .NET), компилятор выдаст вам предупреждение, если где-то в графе вызовов не будет обнаружен блок catch, предполагая, что в графе вызовов это конкретное исключение брошен.

2 голосов
/ 21 сентября 2010

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

1 голос
/ 21 сентября 2010

Да, есть такие критические исключения. Например, начиная с версии 2.0 платформы, StackOverflowException не может быть перехвачен в блоке try-catch

0 голосов
/ 21 сентября 2010

В C # у вас также есть возможность перехватывать необработанные исключения на уровне приложения.Они будут восприниматься как ошибки (ошибка страницы, ошибка приложения), а не как исключения, но у вас есть доступ к последнему исключению, чтобы вы могли хотя бы их регистрироватьНа данный момент у вас больше нет возможности исправить и повторить попытку, но регистрация крайне важна, потому что ваше приложение уже выходит из строя.Unix.

0 голосов
/ 21 сентября 2010

В C # есть особые исключения, от которых вы не можете по-настоящему восстановиться (я думаю, что все они связаны с проблемами памяти) - но все они являются системными исключениями, и вы не можете создать новое из них. *

Нет механизма, заставляющего программиста перехватывать (или помещать объявление throws), как в Java - все исключения будут классифицироваться как непроверенные. Очевидно, что вы все равно можете их перехватить и восстановить, но компилятор не поможет вам с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...