Обработка исключений

Поделись знанием:
Перейти к: навигация, поиск

Обрабо́тка исключи́тельных ситуа́ций (англ. exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».





Исключения

Общее понятие исключительной ситуации

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

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

Виды исключительных ситуаций

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

  • Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы. Так, ошибка чтения файла или коммуникационного канала, нехватка памяти — типичные синхронные исключения, так как возникают они только в операции чтения или в операции выделения памяти соответственно.
  • Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретно инструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питания или поступление новых данных.

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

Обработчики исключений

Общее описание

В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным и универсальным обработчиком исключений становится операционная система. Например, в операционную систему Windows встроена утилита Dr. Watson, которая занимается сбором информации о необработанном исключении и её отправкой на специальный сервер компании Microsoft.

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

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

Существует два принципиально разных механизма функционирования обработчиков исключений.

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

Существует два варианта подключения обработчика исключительных ситуаций к программе: структурная и неструктурная обработка исключений.

Неструктурная обработка исключений

Неструктурная обработка исключений реализуется в виде механизма регистрации функций или команд-обработчиков для каждого возможного типа исключения. Язык программирования или его системные библиотеки предоставляют программисту как минимум две стандартные процедуры: регистрации обработчика и разрегистрации обработчика. Вызов первой из них «привязывает» обработчик к определённому исключению, вызов второй — отменяет эту «привязку». Если исключение происходит, выполнение основного кода программы немедленно прерывается и начинается выполнение обработчика. По завершении обработчика управление передаётся либо в некоторую наперёд заданную точку программы, либо обратно в точку возникновения исключения (в зависимости от заданного способа обработки — с возвратом или без). Независимо от того, какая часть программы в данный момент выполняется, на определённое исключение всегда реагирует последний зарегистрированный для него обработчик. В некоторых языках зарегистрированный обработчик сохраняет силу только в пределах текущего блока кода (процедуры, функции), тогда процедура разрегистрации не требуется. Ниже показан условный фрагмент кода программы с неструктурной обработкой исключений:

  УстановитьОбработчик(ОшибкаБД, ПерейтиНа ОшБД) 
    // На исключение "ОшибкаБД" установлен обработчик - команда "ПерейтиНа ОшБД"
  ... // Здесь находятся операторы работы с БД
  ПерейтиНа СнятьОшБД // Команда безусловного перехода - обход обработчика исключений
  ОшБД:  // метка - сюда произойдёт переход в случае ошибки БД по установленному обработчику
  ... // Обработчик исключения БД  
  СнятьОшБД:  
    // метка - сюда произойдёт переход, если контролируемый код выполнится без ошибки БД. 
  СнятьОбработчик(ОшибкаБД) 
    // Обработчик снят

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

Структурная обработка исключений

Структурная обработка исключений требует обязательной поддержки со стороны языка программирования — наличия специальных синтаксических конструкций. Такая конструкция содержит блок контролируемого кода и обработчик (обработчики) исключений. Наиболее общий вид такой конструкции (условный):

  НачалоБлока
  ... // Контролируемый код
  ...
  если (условие) то СоздатьИсключение Исключение2
  ...
  Обработчик Исключение1
  ... // Код обработчика для Исключения1
  Обработчик Исключение2
  ... // Код обработчика для Исключения2
  ОбработчикНеобработанных
  ... // Код обработки ранее не обработанных исключений
  КонецБлока

Здесь «НачалоБлока» и «КонецБлока» — ключевые слова, которые ограничивают блок контролируемого кода, а «Обработчик» — начало блока обработки соответствующего исключения. Если внутри блока, от начала до первого обработчика, произойдёт исключение, то произойдёт переход на обработчик, написанный для него, после чего весь блок завершится и исполнение будет продолжено со следующей за ним команды. В некоторых языках нет специальных ключевых слов для ограничения блока контролируемого кода, вместо этого обработчик (обработчики) исключений могут быть встроены в некоторые или во все синтаксические конструкции, объединяющие несколько операторов. Так, например, в языке Ада любой составной оператор (begin — end) может содержать обработчик исключений.

«ОбработчикНеобработанных» — это обработчик исключений, которые не соответствуют ни одному из описанных выше в данном блоке. Обработчики исключений в реальности могут описываться по-разному (один обработчик на все исключения, по одному обработчику на каждый тип исключения), но принципиально они работают одинаково: при возникновении исключения находится первый соответствующий ему обработчик в данном блоке, его код выполняется, после чего выполнение блока завершается. Исключения могут возникать как в результате программных ошибок, так и путём явной их генерации с помощью соответствующей команды (в примере — команда «СоздатьИсключение»). С точки зрения обработчиков такие искусственно созданные исключения ничем не отличаются от любых других.

Блоки обработки исключений могут многократно входить друг в друга, как явно (текстуально), так и неявно (например, в блоке вызывается процедура, которая сама имеет блок обработки исключений). Если ни один из обработчиков в текущем блоке не может обработать исключение, то выполнение данного блока немедленно завершается, и управление передаётся на ближайший подходящий обработчик более высокого уровня иерархии. Это продолжается до тех пор, пока обработчик не найдётся и не обработает исключение или пока исключение не выйдет из обработчиков заданных программистом и не будет передано системному обработчику по умолчанию, аварийно закроющему программу.

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

Блоки с гарантированным завершением

Помимо блоков контролируемого кода для обработки исключений, языки программирования могут поддерживать блоки с гарантированным завершением. Их использование оказывается удобным тогда, когда в некотором блоке кода, независимо от того, произошли ли какие-то ошибки, необходимо перед его завершением выполнить определённые действия. Простейший пример: если в процедуре динамически создаётся какой-то локальный объект в памяти, то перед выходом из этой процедуры объект должен быть уничтожен (чтобы избежать утечки памяти), независимо от того, произошли после его создания ошибки или нет. Такая возможность реализуется блоками кода вида:

  НачалоБлока
    ... // Основной код
  Завершение
    ... // Код завершения
  КонецБлока

Заключённые между ключевыми словами «НачалоБлока» и «Завершение» операторы (основной код) выполняются последовательно. Если при их выполнении не возникает исключений, то затем выполняются операторы между ключевыми словами «Завершение» и «КонецБлока» (код завершения). Если же при выполнении основного кода возникает исключение (любое), то сразу же выполняется код завершения, после чего весь блок завершается, а возникшее исключение продолжает существовать и распространяться до тех пор, пока его не перехватит какой-либо блок обработки исключений более высокого уровня.

Принципиальное отличие блока с гарантированным завершением от обработки — то, что он не обрабатывает исключение, а лишь гарантирует выполнение определённого набора операций перед тем, как включится механизм обработки. Нетрудно заметить, что блок с гарантированным завершением легко реализуется с помощью обычного механизма структурной обработки (для этого достаточно поставить команду генерации исключения непосредственно перед завершением контролируемого блока и правильно написать код обработчика), но наличие отдельной конструкции позволяет сделать код более прозрачным и защищает от случайных ошибок.

Поддержка в различных языках

Большинство современных языков программирования, такие как Ada, C++, D, Delphi, Objective-C, Java, JavaScript, Eiffel, OCaml, Ruby, Python, Common Lisp, SML, PHP, все языки платформы .NET и др. имеют встроенную поддержку структурной обработки исключений. В этих языках при возникновении исключения, поддерживаемого языком, происходит раскрутка стека вызовов до первого обработчика исключений подходящего типа, и управление передаётся обработчику.

За исключением незначительных различий в синтаксисе, существует лишь пара вариантов обработки исключений. В наиболее распространённом из них исключительная ситуация генерируется специальным оператором (throw или raise), а само исключение, с точки зрения программы, представляет собой некоторый объект данных. То есть, генерация исключения состоит из двух этапов: создания объекта-исключения и возбуждения исключительной ситуации с этим объектом в качестве параметра. При этом конструирование такого объекта само по себе выброса исключения не вызывает. В одних языках объектом-исключением может быть объект любого типа данных (в том числе строкой, числом, указателем и так далее), в других — только предопределённого типа-исключения (чаще всего он имеет имя Exception) и, возможно, его производных типов (типов-потомков, если язык поддерживает объектные возможности).

Область действия обработчиков начинается специальным ключевым словом try или просто языковым маркером начала блока (например, begin) и заканчивается перед описанием обработчиков (catch, except, resque). Обработчиков может быть несколько, один за одним, и каждый может указывать тип исключения, который он обрабатывает. Как правило, никакого подбора наиболее подходящего обработчика не производится, и выполняется первый же обработчик, совместимый по типу с исключением. Поэтому порядок следования обработчиков имеет важное значение: если обработчик, совместимый с многими или всеми типами исключений, окажется в тексте прежде специфических обработчиков для конкретных типов, то специфические обработчики не будут использоваться вовсе.

Некоторые языки также допускают специальный блок (else), который выполняется, если ни одного исключения не было сгенерировано в соответствующей области действия. Чаще встречается возможность гарантированного завершения блока кода (finally, ensure). Заметным исключением является Си++, где такой конструкции нет. Вместо неё используется автоматический вызов деструкторов объектов. Вместе с тем существуют нестандартные расширения Си++, поддерживающие и функциональность finally (например в MFC).

В целом, обработка исключений может выглядеть следующим образом (в некотором абстрактном языке):

try {
  line = console.readLine();
  if (line.length() == 0)
    throw new EmptyLineException("Строка, считанная с консоли, пустая!");

  console.printLine("Привет, %s!" % line);
}
catch (EmptyLineException exception) {
  console.printLine("Привет!");
}
catch (Exception exception) {
  console.printLine("Ошибка: " + exception.message());
}
else {
  console.printLine("Программа выполнилась без исключительных ситуаций");
}
finally {
  console.printLine("Программа завершается");
}

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

Достоинства и недостатки

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

К сожалению, реализация механизма обработки исключений существенно зависит от языка, и даже компиляторы одного и того же языка на одной и той же платформе могут иметь значительные различия. Это не позволяет прозрачно передавать исключения между частями программы, написанными на разных языках; например, поддерживающие исключения библиотеки обычно непригодны для использования в программах на языках, отличных от тех, для которых они разработаны, и, тем более, на языках, не поддерживающих механизм обработки исключений. Такое состояние существенно ограничивает возможности использования исключений, например, в ОС UNIX и её клонах и под Windows, так как большинство системного ПО и низкоуровневых библиотек этих систем пишется на языке Си, не поддерживающем исключений. Соответственно, для работы с API таких систем с применением исключений приходится писать библиотеки-врапперы, функции которых анализировали бы коды возврата функций API и в нужных случаях генерировали исключения.

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

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

Джоэл Спольски считает, что код, рассчитанный на работу с исключениями, теряет линейность и предсказуемость. Если в классическом коде выходы из блока, процедуры или функции находятся только там, где их явно указал программист, то в коде с исключениями исключение (потенциально) может произойти в любом операторе и анализом самого кода невозможно узнать, где именно исключения могут происходить. В коде же, рассчитанном на исключения, предсказать, в каком месте произойдёт выход из блока кода, невозможно, и любой оператор должен рассматриваться как потенциально последний в блоке, в результате сложность кода возрастает, а надёжность снижается.[1]

Также в сложных программах возникают большие «нагромождения» операторов try ... finally и try ... catch (try ... except), если не использовать аспекты.

Проверяемые исключения

Некоторые проблемы простой обработки исключений

Изначально (например, в C++), не существовало никакой формальной дисциплины описания, генерации и обработки исключений: любое исключение может быть возбуждено в любом месте программы, и, если для него не находится обработчика в стеке вызовов, выполнение программы прерывается аварийно. Если функция (особенно библиотечная) генерирует исключения, то для устойчивой работы использующая её программа должна перехватывать их все. Когда по какой-либо причине одно из возможных исключений оказывается необработанным, будет происходить неожиданное аварийное завершение программы.

С подобными эффектами можно бороться организационными мерами: описывая возможные исключения, возникающие в библиотечных модулях, в соответствующей документации. Но при этом всегда остаётся вероятность пропустить необходимый обработчик из-за случайной ошибки или несоответствия документации коду (что вовсе не редкость). Чтобы полностью исключить потерю обработки исключений, в обработчики приходится специально добавлять ветвь обработки «всех остальных» исключений (которая гарантированно перехватит любые, даже заранее неизвестные исключения), но такой выход не всегда оптимален. Более того, сокрытие всех возможных исключений может привести к ситуации, когда будут скрыты серьёзные, и при этом трудно обнаруживаемые ошибки.

Механизм проверяемых исключений

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

  • В описании функции (или метода класса) в явном виде перечисляются все типы исключений, которые она может сгенерировать.
  • Функция, вызывающая функцию или метод с объявленными исключениями, для каждого из этих исключений обязана либо содержать обработчик, либо, в свою очередь, указывать этот тип как генерируемый ею в своём описании.
  • Компилятор проверяет наличие обработчика в теле функции или записи исключения в её заголовке. Реакция на наличие неописанного и необработанного исключения может быть разной. Например, в Java, если компилятор обнаруживает возможность возникновения исключения, которое не описано в заголовке функции и не обрабатывается в ней, программа считается некорректной и не компилируется. В C++ возникновение в функции неописанного и необработанного исключения приводит к немедленному завершению программы; при этом отсутствие у функции списка объявленных исключений обозначает возможность возникновения любых исключений и стандартный порядок их обработки внешним кодом.

Внешне (в языке Java) реализация такого подхода выглядит следующим образом:

int getVarValue(String varName) throws SQLException {
   ... // код метода, возможно, содержащий вызовы, способные бросить исключение SQLException
}

// Ошибка при компиляции - исключение не объявлено и не перехвачено
int eval1(String expression) {
  ...
  int a = prev + getVarValue("abc");
  ...
}

// Правильно — исключение объявлено и будет передаваться дальше
int eval2(String expression) throws SQLException {
  ...
  int a = prev + getVarValue("abc");
  ...
}

// Правильно — исключение перехватывается внутри метода и наружу не выходит
int eval3(String expression) {
  ...
  try {
    int a = prev + getVarValue("abc");
  } catch (SQLException ex) {
    // Обработка исключения
  }
  ...
}

Здесь метод getVarValue объявлен как генерирующий исключение SQLException. Следовательно, любой использующий его метод должен либо перехватить это исключение, либо объявить его как генерируемое. В данном примере метод eval1 приведёт к ошибке компиляции, поскольку вызывает метод getVarValue, но не перехватывает исключение и не объявляет его. Метод eval2 объявляет исключение, а метод eval3 перехватывает и обрабатывает его, оба этих метода корректны в отношении работы с исключением, вызываемым методом getVarValue.

Преимущества и недостатки

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

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

У проверяемых исключений есть и недостатки.

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

Из-за перечисленных недостатков при обязательности использования проверяемых исключений этот механизм часто обходят. Например, многие библиотеки объявляют все методы как выбрасывающие некоторый общий класс исключений (например, Exception), и только на этот тип исключения создаются обработчики. Результатом становится то, что компилятор заставляет писать обработчики исключений даже там, где они объективно не нужны, и становится невозможно определить без чтения исходников, какие именно подклассы декларируемых исключений бросает метод, чтобы навесить на них разные обработчики. Более правильным подходом считается перехват внутри метода новых исключений, порождённых вызываемым кодом, а при необходимости передать исключение дальше — «заворачивание» его в исключение, уже возвращаемое методом. Например, если метод изменили так, что он начинает обращаться к базе данных вместо файловой системы, то он может сам ловить SQLException и выбрасывать вместо него вновь создаваемый IOException, указывая в качестве причины исходное исключение. Обычно рекомендуется изначально объявлять именно те исключения, которые придётся обрабатывать вызывающему коду. Скажем, если метод извлекает входные данные, то для него целесообразно объявить IOException, а если он оперирует SQL-запросами, то, вне зависимости от природы ошибки, он должен объявлять SQLException. В любом случае, набор выбрасываемых методом исключений должен тщательно продумываться. При необходимости имеет смысл создавать собственные классы исключений, наследуя их от Exception или других подходящих проверяемых исключений.

Исключения, не требующие проверки

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

  • Исключения, представляющие собой серьёзные ошибки, которые, «по идее», возникать не должны, и которые в обычных условиях не следует обрабатывать программой. Такие ошибки могут возникать как во внешней относительно программы среде, так и внутри неё. Примером такой ситуации может быть ошибка среды исполнения программы на Java. Она потенциально возможна при исполнении любой команды; за редчайшими исключениями в прикладной программе не может быть осмысленного обработчика подобной ошибки — ведь если среда исполнения работает неверно, на что указывает сам факт исключения, нет никакой гарантии, что и обработчик будет исполнен правильно.
  • Исключения времени выполнения, обычно связанные с ошибками программиста. Такие исключения возникают из-за логических ошибок разработчика или недостаточности проверок в коде. Например, ошибка обращения по неинициализированному (нулевому) указателю, как правило, означает, что программист либо пропустил где-то инициализацию переменной, либо при выделении динамической памяти не проверил, действительно ли память была выделена. Как первое, так и второе требует исправления кода программы, а не создания обработчиков.

Выносить подобные ошибки вообще за пределы системы обработки исключений нелогично и неудобно, хотя бы потому, что иногда они всё-таки перехватываются и обрабатываются. Поэтому в системах с проверяемыми исключениями часть типов исключений выводится из-под механизма проверки и работает традиционным образом. В Java это классы исключений, унаследованные от java.lang.Error — фатальные ошибки и java.lang.RuntimeException — ошибки времени выполнения, как правило, связанные с ошибками кодирования или недостаточностью проверок в коде программы (неверный аргумент, обращение по пустой ссылке, выход за границы массива, неверное состояние монитора и т. п.).

См. также

Напишите отзыв о статье "Обработка исключений"

Примечания

  1. [www.joelonsoftware.com/items/2003/10/13.html 13 — Joel on Software]

Ссылки

  • [experience.openquality.ru/exception-handling/ Типичные сценарии распространения и обработки исключений]

Отрывок, характеризующий Обработка исключений

Пьер молчал.
– Peut etre plus tard je vous dirai, mon cher, que si je n'avais pas ete la, Dieu sait ce qui serait arrive. Vous savez, mon oncle avant hier encore me promettait de ne pas oublier Boris. Mais il n'a pas eu le temps. J'espere, mon cher ami, que vous remplirez le desir de votre pere. [После я, может быть, расскажу вам, что если б я не была там, то Бог знает, что бы случилось. Вы знаете, что дядюшка третьего дня обещал мне не забыть Бориса, но не успел. Надеюсь, мой друг, вы исполните желание отца.]
Пьер, ничего не понимая и молча, застенчиво краснея, смотрел на княгиню Анну Михайловну. Переговорив с Пьером, Анна Михайловна уехала к Ростовым и легла спать. Проснувшись утром, она рассказывала Ростовым и всем знакомым подробности смерти графа Безухого. Она говорила, что граф умер так, как и она желала бы умереть, что конец его был не только трогателен, но и назидателен; последнее же свидание отца с сыном было до того трогательно, что она не могла вспомнить его без слез, и что она не знает, – кто лучше вел себя в эти страшные минуты: отец ли, который так всё и всех вспомнил в последние минуты и такие трогательные слова сказал сыну, или Пьер, на которого жалко было смотреть, как он был убит и как, несмотря на это, старался скрыть свою печаль, чтобы не огорчить умирающего отца. «C'est penible, mais cela fait du bien; ca eleve l'ame de voir des hommes, comme le vieux comte et son digne fils», [Это тяжело, но это спасительно; душа возвышается, когда видишь таких людей, как старый граф и его достойный сын,] говорила она. О поступках княжны и князя Василья она, не одобряя их, тоже рассказывала, но под большим секретом и шопотом.


В Лысых Горах, имении князя Николая Андреевича Болконского, ожидали с каждым днем приезда молодого князя Андрея с княгиней; но ожидание не нарушало стройного порядка, по которому шла жизнь в доме старого князя. Генерал аншеф князь Николай Андреевич, по прозванию в обществе le roi de Prusse, [король прусский,] с того времени, как при Павле был сослан в деревню, жил безвыездно в своих Лысых Горах с дочерью, княжною Марьей, и при ней компаньонкой, m lle Bourienne. [мадмуазель Бурьен.] И в новое царствование, хотя ему и был разрешен въезд в столицы, он также продолжал безвыездно жить в деревне, говоря, что ежели кому его нужно, то тот и от Москвы полтораста верст доедет до Лысых Гор, а что ему никого и ничего не нужно. Он говорил, что есть только два источника людских пороков: праздность и суеверие, и что есть только две добродетели: деятельность и ум. Он сам занимался воспитанием своей дочери и, чтобы развивать в ней обе главные добродетели, до двадцати лет давал ей уроки алгебры и геометрии и распределял всю ее жизнь в беспрерывных занятиях. Сам он постоянно был занят то писанием своих мемуаров, то выкладками из высшей математики, то точением табакерок на станке, то работой в саду и наблюдением над постройками, которые не прекращались в его имении. Так как главное условие для деятельности есть порядок, то и порядок в его образе жизни был доведен до последней степени точности. Его выходы к столу совершались при одних и тех же неизменных условиях, и не только в один и тот же час, но и минуту. С людьми, окружавшими его, от дочери до слуг, князь был резок и неизменно требователен, и потому, не быв жестоким, он возбуждал к себе страх и почтительность, каких не легко мог бы добиться самый жестокий человек. Несмотря на то, что он был в отставке и не имел теперь никакого значения в государственных делах, каждый начальник той губернии, где было имение князя, считал своим долгом являться к нему и точно так же, как архитектор, садовник или княжна Марья, дожидался назначенного часа выхода князя в высокой официантской. И каждый в этой официантской испытывал то же чувство почтительности и даже страха, в то время как отворялась громадно высокая дверь кабинета и показывалась в напудренном парике невысокая фигурка старика, с маленькими сухими ручками и серыми висячими бровями, иногда, как он насупливался, застилавшими блеск умных и точно молодых блестящих глаз.
В день приезда молодых, утром, по обыкновению, княжна Марья в урочный час входила для утреннего приветствия в официантскую и со страхом крестилась и читала внутренно молитву. Каждый день она входила и каждый день молилась о том, чтобы это ежедневное свидание сошло благополучно.
Сидевший в официантской пудреный старик слуга тихим движением встал и шопотом доложил: «Пожалуйте».
Из за двери слышались равномерные звуки станка. Княжна робко потянула за легко и плавно отворяющуюся дверь и остановилась у входа. Князь работал за станком и, оглянувшись, продолжал свое дело.
Огромный кабинет был наполнен вещами, очевидно, беспрестанно употребляемыми. Большой стол, на котором лежали книги и планы, высокие стеклянные шкафы библиотеки с ключами в дверцах, высокий стол для писания в стоячем положении, на котором лежала открытая тетрадь, токарный станок, с разложенными инструментами и с рассыпанными кругом стружками, – всё выказывало постоянную, разнообразную и порядочную деятельность. По движениям небольшой ноги, обутой в татарский, шитый серебром, сапожок, по твердому налеганию жилистой, сухощавой руки видна была в князе еще упорная и много выдерживающая сила свежей старости. Сделав несколько кругов, он снял ногу с педали станка, обтер стамеску, кинул ее в кожаный карман, приделанный к станку, и, подойдя к столу, подозвал дочь. Он никогда не благословлял своих детей и только, подставив ей щетинистую, еще небритую нынче щеку, сказал, строго и вместе с тем внимательно нежно оглядев ее:
– Здорова?… ну, так садись!
Он взял тетрадь геометрии, писанную его рукой, и подвинул ногой свое кресло.
– На завтра! – сказал он, быстро отыскивая страницу и от параграфа до другого отмечая жестким ногтем.
Княжна пригнулась к столу над тетрадью.
– Постой, письмо тебе, – вдруг сказал старик, доставая из приделанного над столом кармана конверт, надписанный женскою рукой, и кидая его на стол.
Лицо княжны покрылось красными пятнами при виде письма. Она торопливо взяла его и пригнулась к нему.
– От Элоизы? – спросил князь, холодною улыбкой выказывая еще крепкие и желтоватые зубы.
– Да, от Жюли, – сказала княжна, робко взглядывая и робко улыбаясь.
– Еще два письма пропущу, а третье прочту, – строго сказал князь, – боюсь, много вздору пишете. Третье прочту.
– Прочтите хоть это, mon pere, [батюшка,] – отвечала княжна, краснея еще более и подавая ему письмо.
– Третье, я сказал, третье, – коротко крикнул князь, отталкивая письмо, и, облокотившись на стол, пододвинул тетрадь с чертежами геометрии.
– Ну, сударыня, – начал старик, пригнувшись близко к дочери над тетрадью и положив одну руку на спинку кресла, на котором сидела княжна, так что княжна чувствовала себя со всех сторон окруженною тем табачным и старчески едким запахом отца, который она так давно знала. – Ну, сударыня, треугольники эти подобны; изволишь видеть, угол abc…
Княжна испуганно взглядывала на близко от нее блестящие глаза отца; красные пятна переливались по ее лицу, и видно было, что она ничего не понимает и так боится, что страх помешает ей понять все дальнейшие толкования отца, как бы ясны они ни были. Виноват ли был учитель или виновата была ученица, но каждый день повторялось одно и то же: у княжны мутилось в глазах, она ничего не видела, не слышала, только чувствовала близко подле себя сухое лицо строгого отца, чувствовала его дыхание и запах и только думала о том, как бы ей уйти поскорее из кабинета и у себя на просторе понять задачу.
Старик выходил из себя: с грохотом отодвигал и придвигал кресло, на котором сам сидел, делал усилия над собой, чтобы не разгорячиться, и почти всякий раз горячился, бранился, а иногда швырял тетрадью.
Княжна ошиблась ответом.
– Ну, как же не дура! – крикнул князь, оттолкнув тетрадь и быстро отвернувшись, но тотчас же встал, прошелся, дотронулся руками до волос княжны и снова сел.
Он придвинулся и продолжал толкование.
– Нельзя, княжна, нельзя, – сказал он, когда княжна, взяв и закрыв тетрадь с заданными уроками, уже готовилась уходить, – математика великое дело, моя сударыня. А чтобы ты была похожа на наших глупых барынь, я не хочу. Стерпится слюбится. – Он потрепал ее рукой по щеке. – Дурь из головы выскочит.
Она хотела выйти, он остановил ее жестом и достал с высокого стола новую неразрезанную книгу.
– Вот еще какой то Ключ таинства тебе твоя Элоиза посылает. Религиозная. А я ни в чью веру не вмешиваюсь… Просмотрел. Возьми. Ну, ступай, ступай!
Он потрепал ее по плечу и сам запер за нею дверь.
Княжна Марья возвратилась в свою комнату с грустным, испуганным выражением, которое редко покидало ее и делало ее некрасивое, болезненное лицо еще более некрасивым, села за свой письменный стол, уставленный миниатюрными портретами и заваленный тетрадями и книгами. Княжна была столь же беспорядочная, как отец ее порядочен. Она положила тетрадь геометрии и нетерпеливо распечатала письмо. Письмо было от ближайшего с детства друга княжны; друг этот была та самая Жюли Карагина, которая была на именинах у Ростовых:
Жюли писала:
«Chere et excellente amie, quelle chose terrible et effrayante que l'absence! J'ai beau me dire que la moitie de mon existence et de mon bonheur est en vous, que malgre la distance qui nous separe, nos coeurs sont unis par des liens indissolubles; le mien se revolte contre la destinee, et je ne puis, malgre les plaisirs et les distractions qui m'entourent, vaincre une certaine tristesse cachee que je ressens au fond du coeur depuis notre separation. Pourquoi ne sommes nous pas reunies, comme cet ete dans votre grand cabinet sur le canape bleu, le canape a confidences? Pourquoi ne puis je, comme il y a trois mois, puiser de nouvelles forces morales dans votre regard si doux, si calme et si penetrant, regard que j'aimais tant et que je crois voir devant moi, quand je vous ecris».
[Милый и бесценный друг, какая страшная и ужасная вещь разлука! Сколько ни твержу себе, что половина моего существования и моего счастия в вас, что, несмотря на расстояние, которое нас разлучает, сердца наши соединены неразрывными узами, мое сердце возмущается против судьбы, и, несмотря на удовольствия и рассеяния, которые меня окружают, я не могу подавить некоторую скрытую грусть, которую испытываю в глубине сердца со времени нашей разлуки. Отчего мы не вместе, как в прошлое лето, в вашем большом кабинете, на голубом диване, на диване «признаний»? Отчего я не могу, как три месяца тому назад, почерпать новые нравственные силы в вашем взгляде, кротком, спокойном и проницательном, который я так любила и который я вижу перед собой в ту минуту, как пишу вам?]
Прочтя до этого места, княжна Марья вздохнула и оглянулась в трюмо, которое стояло направо от нее. Зеркало отразило некрасивое слабое тело и худое лицо. Глаза, всегда грустные, теперь особенно безнадежно смотрели на себя в зеркало. «Она мне льстит», подумала княжна, отвернулась и продолжала читать. Жюли, однако, не льстила своему другу: действительно, и глаза княжны, большие, глубокие и лучистые (как будто лучи теплого света иногда снопами выходили из них), были так хороши, что очень часто, несмотря на некрасивость всего лица, глаза эти делались привлекательнее красоты. Но княжна никогда не видала хорошего выражения своих глаз, того выражения, которое они принимали в те минуты, когда она не думала о себе. Как и у всех людей, лицо ее принимало натянуто неестественное, дурное выражение, как скоро она смотрелась в зеркало. Она продолжала читать: 211
«Tout Moscou ne parle que guerre. L'un de mes deux freres est deja a l'etranger, l'autre est avec la garde, qui se met en Marieche vers la frontiere. Notre cher еmpereur a quitte Petersbourg et, a ce qu'on pretend, compte lui meme exposer sa precieuse existence aux chances de la guerre. Du veuille que le monstre corsicain, qui detruit le repos de l'Europe, soit terrasse par l'ange que le Tout Рuissant, dans Sa misericorde, nous a donnee pour souverain. Sans parler de mes freres, cette guerre m'a privee d'une relation des plus cheres a mon coeur. Je parle du jeune Nicolas Rostoff, qui avec son enthousiasme n'a pu supporter l'inaction et a quitte l'universite pour aller s'enroler dans l'armee. Eh bien, chere Marieie, je vous avouerai, que, malgre son extreme jeunesse, son depart pour l'armee a ete un grand chagrin pour moi. Le jeune homme, dont je vous parlais cet ete, a tant de noblesse, de veritable jeunesse qu'on rencontre si rarement dans le siecle оu nous vivons parmi nos villards de vingt ans. Il a surtout tant de franchise et de coeur. Il est tellement pur et poetique, que mes relations avec lui, quelque passageres qu'elles fussent, ont ete l'une des plus douees jouissances de mon pauvre coeur, qui a deja tant souffert. Je vous raconterai un jour nos adieux et tout ce qui s'est dit en partant. Tout cela est encore trop frais. Ah! chere amie, vous etes heureuse de ne pas connaitre ces jouissances et ces peines si poignantes. Vous etes heureuse, puisque les derienieres sont ordinairement les plus fortes! Je sais fort bien, que le comte Nicolas est trop jeune pour pouvoir jamais devenir pour moi quelque chose de plus qu'un ami, mais cette douee amitie, ces relations si poetiques et si pures ont ete un besoin pour mon coeur. Mais n'en parlons plus. La grande nouvelle du jour qui occupe tout Moscou est la mort du vieux comte Безухой et son heritage. Figurez vous que les trois princesses n'ont recu que tres peu de chose, le prince Basile rien, est que c'est M. Pierre qui a tout herite, et qui par dessus le Marieche a ete reconnu pour fils legitime, par consequent comte Безухой est possesseur de la plus belle fortune de la Russie. On pretend que le prince Basile a joue un tres vilain role dans toute cette histoire et qu'il est reparti tout penaud pour Petersbourg.
«Je vous avoue, que je comprends tres peu toutes ces affaires de legs et de testament; ce que je sais, c'est que depuis que le jeune homme que nous connaissions tous sous le nom de M. Pierre les tout court est devenu comte Безухой et possesseur de l'une des plus grandes fortunes de la Russie, je m'amuse fort a observer les changements de ton et des manieres des mamans accablees de filles a Marieier et des demoiselles elles memes a l'egard de cet individu, qui, par parenthese, m'a paru toujours etre un pauvre, sire. Comme on s'amuse depuis deux ans a me donner des promis que je ne connais pas le plus souvent, la chronique matrimoniale de Moscou me fait comtesse Безухой. Mais vous sentez bien que je ne me souc nullement de le devenir. A propos de Marieiage, savez vous que tout derienierement la tante en general Анна Михайловна, m'a confie sous le sceau du plus grand secret un projet de Marieiage pour vous. Ce n'est ni plus, ni moins, que le fils du prince Basile, Anatole, qu'on voudrait ranger en le Marieiant a une personne riche et distinguee, et c'est sur vous qu'est tombe le choix des parents. Je ne sais comment vous envisagerez la chose, mais j'ai cru de mon devoir de vous en avertir. On le dit tres beau et tres mauvais sujet; c'est tout ce que j'ai pu savoir sur son compte.
«Mais assez de bavardage comme cela. Je finis mon second feuillet, et maman me fait chercher pour aller diner chez les Apraksines. Lisez le livre mystique que je vous envoie et qui fait fureur chez nous. Quoiqu'il y ait des choses dans ce livre difficiles a atteindre avec la faible conception humaine, c'est un livre admirable dont la lecture calme et eleve l'ame. Adieu. Mes respects a monsieur votre pere et mes compliments a m elle Bourienne. Je vous embrasse comme je vous aime. Julie».
«P.S.Donnez moi des nouvelles de votre frere et de sa charmante petite femme».
[Вся Москва только и говорит что о войне. Один из моих двух братьев уже за границей, другой с гвардией, которая выступает в поход к границе. Наш милый государь оставляет Петербург и, как предполагают, намерен сам подвергнуть свое драгоценное существование случайностям войны. Дай Бог, чтобы корсиканское чудовище, которое возмущает спокойствие Европы, было низвергнуто ангелом, которого Всемогущий в Своей благости поставил над нами повелителем. Не говоря уже о моих братьях, эта война лишила меня одного из отношений самых близких моему сердцу. Я говорю о молодом Николае Ростове; который, при своем энтузиазме, не мог переносить бездействия и оставил университет, чтобы поступить в армию. Признаюсь вам, милая Мари, что, несмотря на его чрезвычайную молодость, отъезд его в армию был для меня большим горем. В молодом человеке, о котором я говорила вам прошлым летом, столько благородства, истинной молодости, которую встречаешь так редко в наш век между двадцатилетними стариками! У него особенно так много откровенности и сердца. Он так чист и полон поэзии, что мои отношения к нему, при всей мимолетности своей, были одною из самых сладостных отрад моего бедного сердца, которое уже так много страдало. Я вам расскажу когда нибудь наше прощанье и всё, что говорилось при прощании. Всё это еще слишком свежо… Ах! милый друг, вы счастливы, что не знаете этих жгучих наслаждений, этих жгучих горестей. Вы счастливы, потому что последние обыкновенно сильнее первых. Я очень хорошо знаю, что граф Николай слишком молод для того, чтобы сделаться для меня чем нибудь кроме как другом. Но эта сладкая дружба, эти столь поэтические и столь чистые отношения были потребностью моего сердца. Но довольно об этом.
«Главная новость, занимающая всю Москву, – смерть старого графа Безухого и его наследство. Представьте себе, три княжны получили какую то малость, князь Василий ничего, а Пьер – наследник всего и, сверх того, признан законным сыном и потому графом Безухим и владельцем самого огромного состояния в России. Говорят, что князь Василий играл очень гадкую роль во всей этой истории, и что он уехал в Петербург очень сконфуженный. Признаюсь вам, я очень плохо понимаю все эти дела по духовным завещаниям; знаю только, что с тех пор как молодой человек, которого мы все знали под именем просто Пьера, сделался графом Безухим и владельцем одного из лучших состояний России, – я забавляюсь наблюдениями над переменой тона маменек, у которых есть дочери невесты, и самих барышень в отношении к этому господину, который (в скобках будь сказано) всегда казался мне очень ничтожным. Так как уже два года все забавляются тем, чтобы приискивать мне женихов, которых я большею частью не знаю, то брачная хроника Москвы делает меня графинею Безуховой. Но вы понимаете, что я нисколько этого не желаю. Кстати о браках. Знаете ли вы, что недавно всеобщая тетушка Анна Михайловна доверила мне, под величайшим секретом, замысел устроить ваше супружество. Это ни более ни менее как сын князя Василья, Анатоль, которого хотят пристроить, женив его на богатой и знатной девице, и на вас пал выбор родителей. Я не знаю, как вы посмотрите на это дело, но я сочла своим долгом предуведомить вас. Он, говорят, очень хорош и большой повеса. Вот всё, что я могла узнать о нем.
Но будет болтать. Кончаю мой второй листок, а маменька прислала за мной, чтобы ехать обедать к Апраксиным.
Прочитайте мистическую книгу, которую я вам посылаю; она имеет у нас огромный успех. Хотя в ней есть вещи, которые трудно понять слабому уму человеческому, но это превосходная книга; чтение ее успокоивает и возвышает душу. Прощайте. Мое почтение вашему батюшке и мои приветствия m lle Бурьен. Обнимаю вас от всего сердца. Юлия.
PS. Известите меня о вашем брате и о его прелестной жене.]
Княжна подумала, задумчиво улыбаясь (при чем лицо ее, освещенное ее лучистыми глазами, совершенно преобразилось), и, вдруг поднявшись, тяжело ступая, перешла к столу. Она достала бумагу, и рука ее быстро начала ходить по ней. Так писала она в ответ:
«Chere et excellente ami. Votre lettre du 13 m'a cause une grande joie. Vous m'aimez donc toujours, ma poetique Julie.
L'absence, dont vous dites tant de mal, n'a donc pas eu son influenсе habituelle sur vous. Vous vous plaignez de l'absence – que devrai je dire moi, si j'osais me plaindre, privee de tous ceux qui me sont chers? Ah l si nous n'avions pas la religion pour nous consoler, la vie serait bien triste. Pourquoi me supposez vous un regard severe, quand vous me parlez de votre affection pour le jeune homme? Sous ce rapport je ne suis rigide que pour moi. Je comprends ces sentiments chez les autres et si je ne puis approuver ne les ayant jamais ressentis, je ne les condamiene pas. Me parait seulement que l'amour chretien, l'amour du prochain, l'amour pour ses ennemis est plus meritoire, plus doux et plus beau, que ne le sont les sentiments que peuvent inspire les beaux yeux d'un jeune homme a une jeune fille poetique et aimante comme vous.
«La nouvelle de la mort du comte Безухой nous est parvenue avant votre lettre, et mon pere en a ete tres affecte. Il dit que c'etait avant derienier representant du grand siecle, et qu'a present c'est son tour; mais qu'il fera son possible pour que son tour vienne le plus tard possible. Que Dieu nous garde de ce terrible malheur! Je ne puis partager votre opinion sur Pierre que j'ai connu enfant. Il me paraissait toujours avoir un coeur excellent, et c'est la qualite que j'estime le plus dans les gens. Quant a son heritage et au role qu'y a joue le prince Basile, c'est bien triste pour tous les deux. Ah! chere amie, la parole de notre divin Sauveur qu'il est plus aise a un hameau de passer par le trou d'une aiguille, qu'il ne l'est a un riche d'entrer dans le royaume de Dieu, cette parole est terriblement vraie; je plains le prince Basile et je regrette encore davantage Pierre. Si jeune et accable de cette richesse, que de tentations n'aura t il pas a subir! Si on me demandait ce que je desirerais le plus au monde, ce serait d'etre plus pauvre que le plus pauvre des mendiants. Mille graces, chere amie, pour l'ouvrage que vous m'envoyez, et qui fait si grande fureur chez vous. Cependant, puisque vous me dites qu'au milieu de plusurs bonnes choses il y en a d'autres que la faible conception humaine ne peut atteindre, il me parait assez inutile de s'occuper d'une lecture inintelligible, qui par la meme ne pourrait etre d'aucun fruit. Je n'ai jamais pu comprendre la passion qu'ont certaines personnes de s'embrouiller l'entendement, en s'attachant a des livres mystiques, qui n'elevent que des doutes dans leurs esprits, exaltant leur imagination et leur donnent un caractere d'exageration tout a fait contraire a la simplicite chretnne. Lisons les Apotres et l'Evangile. Ne cherchons pas a penetrer ce que ceux la renferment de mysterux, car, comment oserions nous, miserables pecheurs que nous sommes, pretendre a nous initier dans les secrets terribles et sacres de la Providence, tant que nous portons cette depouille charienelle, qui eleve entre nous et l'Eterienel un voile impenetrable? Borienons nous donc a etudr les principes sublimes que notre divin Sauveur nous a laisse pour notre conduite ici bas; cherchons a nous y conformer et a les suivre, persuadons nous que moins nous donnons d'essor a notre faible esprit humain et plus il est agreable a Dieu, Qui rejette toute science ne venant pas de Lui;que moins nous cherchons a approfondir ce qu'il Lui a plu de derober a notre connaissance,et plutot II nous en accordera la decouverte par Son divin esprit.
«Mon pere ne m'a pas parle du pretendant, mais il m'a dit seulement qu'il a recu une lettre et attendait une visite du prince Basile. Pour ce qui est du projet de Marieiage qui me regarde, je vous dirai, chere et excellente amie, que le Marieiage, selon moi,est une institution divine a laquelle il faut se conformer. Quelque penible que cela soit pour moi, si le Tout Puissant m'impose jamais les devoirs d'epouse et de mere, je tacherai de les remplir aussi fidelement que je le pourrai, sans m'inquieter de l'examen de mes sentiments a l'egard de celui qu'il me donnera pour epoux. J'ai recu une lettre de mon frere, qui m'annonce son arrivee a Лысые Горы avec sa femme. Ce sera une joie de courte duree, puisqu'il nous quitte pour prendre part a cette malheureuse guerre, a laquelle nous sommes entraines Dieu sait, comment et pourquoi. Non seulement chez vous au centre des affaires et du monde on ne parle que de guerre, mais ici, au milieu de ces travaux champetres et de ce calme de la nature, que les citadins se representent ordinairement a la campagne, les bruits de la guerre se font entendre et sentir peniblement. Mon pere ne parle que Marieche et contreMarieche, choses auxquelles je ne comprends rien; et avant hier en faisant ma promenade habituelle dans la rue du village, je fus temoin d'une scene dechirante… C'etait un convoi des recrues enroles chez nous et expedies pour l'armee… Il fallait voir l'etat dans lequel se trouvant les meres, les femmes, les enfants des hommes qui partaient et entendre les sanglots des uns et des autres!
On dirait que l'humanite a oublie les lois de son divin Sauveur, Qui prechait l'amour et le pardon des offenses, et qu'elle fait consister son plus grand merite dans l'art de s'entretuer.
«Adieu, chere et bonne amie, que notre divin Sauveur et Sa tres Sainte Mere vous aient en Leur sainte et puissante garde. Marieie».
[Милый и бесценный друг. Ваше письмо от 13 го доставило мне большую радость. Вы всё еще меня любите, моя поэтическая Юлия. Разлука, о которой вы говорите так много дурного, видно, не имела на вас своего обычного влияния. Вы жалуетесь на разлуку, что же я должна была бы сказать, если бы смела, – я, лишенная всех тех, кто мне дорог? Ах, ежели бы не было у нас религии для утешения, жизнь была бы очень печальна. Почему приписываете вы мне строгий взгляд, когда говорите о вашей склонности к молодому человеку? В этом отношении я строга только к себе. Я понимаю эти чувства у других, и если не могу одобрять их, никогда не испытавши, то и не осуждаю их. Мне кажется только, что христианская любовь, любовь к ближнему, любовь к врагам, достойнее, слаще и лучше, чем те чувства, которые могут внушить прекрасные глаза молодого человека молодой девушке, поэтической и любящей, как вы.
Известие о смерти графа Безухова дошло до нас прежде вашего письма, и мой отец был очень тронут им. Он говорит, что это был предпоследний представитель великого века, и что теперь черед за ним, но что он сделает все, зависящее от него, чтобы черед этот пришел как можно позже. Избави нас Боже от этого несчастия.
Я не могу разделять вашего мнения о Пьере, которого знала еще ребенком. Мне казалось, что у него было всегда прекрасное сердце, а это то качество, которое я более всего ценю в людях. Что касается до его наследства и до роли, которую играл в этом князь Василий, то это очень печально для обоих. Ах, милый друг, слова нашего Божественного Спасителя, что легче верблюду пройти в иглиное ухо, чем богатому войти в царствие Божие, – эти слова страшно справедливы. Я жалею князя Василия и еще более Пьера. Такому молодому быть отягощенным таким огромным состоянием, – через сколько искушений надо будет пройти ему! Если б у меня спросили, чего я желаю более всего на свете, – я желаю быть беднее самого бедного из нищих. Благодарю вас тысячу раз, милый друг, за книгу, которую вы мне посылаете и которая делает столько шуму у вас. Впрочем, так как вы мне говорите, что в ней между многими хорошими вещами есть такие, которых не может постигнуть слабый ум человеческий, то мне кажется излишним заниматься непонятным чтением, которое по этому самому не могло бы принести никакой пользы. Я никогда не могла понять страсть, которую имеют некоторые особы, путать себе мысли, пристращаясь к мистическим книгам, которые возбуждают только сомнения в их умах, раздражают их воображение и дают им характер преувеличения, совершенно противный простоте христианской.
Будем читать лучше Апостолов и Евангелие. Не будем пытаться проникнуть то, что в этих книгах есть таинственного, ибо как можем мы, жалкие грешники, познать страшные и священные тайны Провидения до тех пор, пока носим на себе ту плотскую оболочку, которая воздвигает между нами и Вечным непроницаемую завесу? Ограничимся лучше изучением великих правил, которые наш Божественный Спаситель оставил нам для нашего руководства здесь, на земле; будем стараться следовать им и постараемся убедиться в том, что чем меньше мы будем давать разгула нашему уму, тем мы будем приятнее Богу, Который отвергает всякое знание, исходящее не от Него, и что чем меньше мы углубляемся в то, что Ему угодно было скрыть от нас, тем скорее даст Он нам это открытие Своим божественным разумом.