Поскольку разработчики Java смогли увидеть проблемы, возникающие при обработке исключений очистки в блоках using
.NET, прежде чем реализовывать собственную функцию попытки использования ресурсов, они смогли ее улучшить. В .NET автор блока Dispose
часто сталкивается с неприятным выбором между проглатыванием любых возникающих исключений, что позволяет вызывающей программе ошибочно полагать, что все в порядке, или предоставлением исключениям просачиваться из Dispose
таким образом, чтобы стереть все доказательства. любого предыдущего исключения. К счастью, Java позволяет избежать этой проблемы.
Если блок try-with-resources завершается нормально, и блок close
также завершается успешно, то внешний код видит все как обычно. Если в части try
возникает исключение, но close
выполняется нормально, внешний код увидит исключение try-block. Если try
завершается нормально, но close
выбрасывает, внешний код увидит исключение close
. И если try
выбрасывает, но close
тоже выбрасывает, то внешний код увидит исключение try
, но также сможет получить любое исключение, возникшее в close
(и если во время close
возникнет несколько вложенных исключений try-with-resources, все выброшенные исключения будут доступны для внешнего кода).
Следовательно, в отличие от дизайна .NET, который часто вынуждает авторов подавлять некоторые потенциально серьезные исключения, выдаваемые Dispose
, дизайн Java предпочитает, чтобы close
генерировало исключение каждый раз, когда что-то идет не так, что вызывающая сторона не может поверить, что все в порядке.
person
supercat
schedule
21.10.2014