Что вы могли бы сделать, это дать class="sku_wrapper"
visibility: hidden;
. И дать class="sku"
, который находится внутри sku_wrapper и visibility: initial;
Протестировано и работает
В этом контексте операция повышения не имеет никакого эффекта и должна быть удалена, потому что она просто повторно вызывает исключение, которое только что перехватил блок исключения. Повышение обычно используется для передачи управления в конец блока, когда нет подходящей обработки ошибок. Далее мы обрабатываем пользовательское исключение, но любое другое исключение должно быть обработано в другом месте.
try
someOperation;
except
on e: ECustomException do
SomeCustomHandelr;
else
begin
// the raise is only useful to rethrow the exception to an encompasing
// handler. In this case after I have called my logger code. as Rob
// mentioned this can be omitted if you arent handling anything because
// the compiler will simply jump you to the next block if there is no
// else.
LogUnexpectedException('some operation failed',e);
raise;
end;
end;
Будьте осторожны, что есть похожая форма без «повышения», которое имеет побочный эффект от еды / сокрытия любых исключений. практики очень недобросовестных разработчиков, которые, как мы надеемся, перешли на позиции конкурентов.
with ADOQuery1 do begin
// .. fill out sql.text, etc
try
execSQL;
except
// no handler so this just eats any "errors"
end;
Удаление кода исключения из приведенного выше фрагмента кода не будет иметь значения.
Возможно, я ответил немного быстро, смотри в конце ...
Как это, это бесполезно для приложения .
Период!
Теперь на стороне «почему». Может быть, стандартизировать обработку исключений, если / был / будет / будет / находится в других местах / какой-либо код регистрации, вставленный перед повышением:
try
execSQL;
except
// Log Exception..
on E: Exception do
begin
LogTrace(Format('%s: Exception Message[%s]',[methodname, E.Message]));
raise;
end;
end;
или для кода очистки:
try
execSQL;
except
//some FreeAndNil..
raise;
end;
Обновление : Там будет 1 случай, когда я увидел бы какое-то использование, как оно есть ...
... чтобы иметь возможность поставить точку останова на линии повышения
, чтобы получить возможность увидеть, что происходит в контексте этого блока кода.
Хорошо, действительно два вопроса здесь.
Во-первых, это имеет значение значимо : если execSQL выдает исключение, оно перехватывается блоком try и перенаправляется в исключение. Затем он передается при повышении до следующего более высокого блока.
Во-вторых, полезно ли это ? Возможно нет. Это почти наверняка является результатом одной из трех вещей:
execSQL
, в другое, более значимое исключение. На самом деле, я должен опубликовать это как комментарий к ответам Франсуа, но я не знаю, возможно ли вставить туда отформатированный код :( Поэтому я публикую это как ответ.
2mghie:
Второй полностью недиоматичен, вместо него нужно использовать finally.
Нет, «finally» будет очищать объект всегда. «За исключением» - только при исключении. Рассмотрим случай функции, которая создает, заполняет и вернуть объект:
function CreateObj: TSomeObj;
begin
Result := TSomeObj.Create;
try
... // do something with Result: load data, fill props, etc.
except
FreeAndNil(Result); // oops: bad things happened. Free object to avoid leak.
raise;
end;
end;
Если вы поместите туда «finally» - функция всегда будет возвращать nil. Если вы вообще пропустите блок «try» - произойдет утечка ресурсов в случае исключения в «...».
PS Конечно, вы можете использовать «finally» и проверить ExceptObj, но ... разве это не уродливо?
Этот код ничего не делает, кроме того, что позволяет исходному программисту поместить точку останова в «Повышение» и увидеть исключение в источнике ближе к его возможной причине. В этом смысле это совершенно разумная техника отладки.
Название содержит довольно широкий вопрос, а его объяснение дает более конкретный пример. Итак, мой ответ на вопрос о том, как он исходит из примера, несомненно, может добавить что-нибудь полезное к тому, что уже было сказано здесь.
Но, может быть, Blorgbeard действительно хочет знать, так ли это вообще имеет смысл попробовать ... кроме рейза; Конец
. В Delphi 7, если я правильно помню, Exit
вызовет finally
часть блока try-finally
(как если бы это было какое-то исключение). Кто-то может посчитать такое поведение неуместным для своей задачи, и использование рассматриваемой конструкции - довольно обходной путь.
Только было бы странно использовать один рейз;
там,
Это код ничего не делает, кроме повторного вызова исключения, которое уже будет вызвано без этой попытки, кроме блока. Вы можете безопасно удалить его.