Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Решив передать исключение, удостоверьтесь, что уровень абстракции исключения и метода совпадают. Вот как не надо делать:

Плохой пример Java-класса, который генерирует исключение на неверном уровне абстракции

class Employee {

- Объявление исключения с неправильным уровнем абстракции.

public Taxld GetTaxIdO throws EOFException {

Функция GetTaxIdQ передает низкоуровневое исключение EOFException вызывающей стороне. Она не обрабатывает исключение сама, а раскрывает некоторые детали своей реализации, генерируя низкоуровневое исключение. Это привязывает клиентский код не к классу Employee, а к коду внутри класса Employee, генерирующему исключение EOFException. Инкапсуляция нарушена, управляемость кода ухудшается.

Вместо этого код GetTaxIdQ должен передавать исключение, соответствующее интерфейсу класса, частью которого он является, например, так:

Хороший пример Java-класса, который генерирует исключение на правильном уровне абстракции

class Employee {

Объявление исключения, соответствующего уровню абстракции.

public Taxld GetTaxIdO throws EmployeeDataNotAvailable {

Код обработки исключений внутри GetTaxIdQ, возможно, просто устанавливает соответствие между исключениями iodisk not ready и EmployeeDataNotAvailable, что гораздо лучше, так как сохраняется абстракция интерфейса.

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



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

Плохой пример игнорирования исключения (Java)

try {

много кода

} catch ( AnException exception ) { }

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

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

Хороший пример игнорирования исключения на Java

try {

много кода

} catch ( AnException exception ) { LogError( "Unexpected exception" );

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

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

Вот пример упрощенного обработчика исключений. Он просто печатает диагностическое сообщение:



Пример централизованного генератора сообщений об исключениях, часть 1 (Visual Basic)

Sub ReportException(

ByVal className, " й>«ттштшттт

- ЭТОЙ технологий см. Practical

ByVal thisException As Exception 3 щ

) Basic .ШЪ (Foxall, ШЩ.

Dim message As String

Dim caption As String

message = "Exception: " & thisException.Message & "." & ControlChars.CrLf & "Class: " & className & ControlChars.CrLf & "Routine: " & thisException.TargetSite.Name & ControlChars.CrLf

caption = "Exception"

MessageBox.Show( message, caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation )

End Sub

Этот обработчик можно использовать следующим образом:

Пример централизованного генератора сообщений об исключениях, часть 2 (Visual Basic)

Catch exceptionObject As Exception

ReportException( CLASS NAME, exceptionObject ) End Try

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

Если вы решили создать централизованный генератор сообщений, примите во внимание основные проблемы с централизованной обработкой ошибок, обсуждаемые в подразделе «Вызвать процедуру или объект - обработчик ошибок» раздела 8.3.

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

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

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 [64] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0117