Руководство по Ada (Ada 2022)
1.1.5 Классификация ошибок
Требования к реализации
Определение языка классифицирует ошибки на несколько различных категорий:
- Ошибки, которые должны быть обнаружены каждой реализацией Ada до выполнения;
Эти ошибки соответствуют любому нарушению правила, приведенного в этом документе, кроме перечисленных ниже. В частности, нарушение любого правила, использующего термины «должен», «разрешено», «допускается», «законный» или «незаконный», относится к этой категории. Любая программа, содержащая такую ошибку, не является законной программой Ada; с другой стороны, тот факт, что программа является законной, не означает ipso facto, что программа свободна от других форм ошибок.
Правила далее классифицируются как правила времени компиляции или правила после компиляции, в зависимости от того, должно ли нарушение быть обнаружено в момент предоставления модуля компиляции компилятору или может быть отложено до момента включения модуля компиляции в партицию программы.
- Ошибки, которые должны быть обнаружены во время выполнения программы Ada;
Соответствующие ситуации ошибок связаны с именами предопределенных исключений. Каждая реализация компилятора Ada обязана сгенерировать код, который вызывает соответствующее исключение, если такая ситуация ошибки возникает во время выполнения программы. Если такая ситуация ошибки обязательно возникает при каждом выполнении конструкции, то реализация допускается (хотя и не требуется) сообщить об этом факте во время компиляции.
- Ограниченные ошибки;
Правила языка определяют определенные типы ошибок, которые, как ожидается, не будут обнаружены ни до, ни во время выполнения, но если они не обнаружены, диапазон возможных последствий должен быть ограничен. Ошибки этой категории называются ограниченными ошибками. Возможные последствия заданной ограниченной ошибки указаны для каждой такой ошибки, но в любом случае одним возможным последствием ограниченной ошибки является возбуждение исключения Program_Error.
- Ошибка выполнения.
Помимо ограниченных ошибок, правила языка определяют определенные типы ошибок, которые приводят к ошибкам выполнения. Как и ограниченные ошибки, реализация не должна обнаруживать такие ошибки ни до, ни во время выполнения. В отличие от ограниченных ошибок, нет заданного языком ограничения на возможные последствия ошибки выполнения; эффект, как правило, непредсказуем.
Разрешения реализации
Реализация может предоставить нестандартные режимы работы. Обычно эти режимы выбираются с помощью pragma или переключателя командной строки при вызове компилятора. При работе в нестандартном режиме реализация может отклонить compilation_unit, которые не соответствуют дополнительным требованиям, связанным с режимом, таким как чрезмерное количество предупреждений или нарушение рекомендаций по стилю кодирования. Аналогично, в нестандартном режиме реализация может применять особые оптимизации или альтернативные алгоритмы, которые имеют смысл только для программ, удовлетворяющих определённым критериям, указанным реализацией. В любом случае, реализация должна поддерживать стандартный режим, соответствующий требованиям данного Справочника; в частности, в стандартном режиме все законные compilation_unit должны быть приняты.
Рекомендации по реализации
Если реализация обнаруживает ограниченную ошибку или ошибку выполнения, она должна возбудить Program_Error.