В Дельфи 7, 'попытка … кроме повышения; конец'; значимый вообще?

Что вы могли бы сделать, это дать class="sku_wrapper" visibility: hidden;. И дать class="sku", который находится внутри sku_wrapper и visibility: initial;

Протестировано и работает

7
задан Blorgbeard 30 April 2009 в 02:12
поделиться

8 ответов

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

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;
10
ответ дан 6 December 2019 в 07:52
поделиться

Удаление кода исключения из приведенного выше фрагмента кода не будет иметь значения.

6
ответ дан 6 December 2019 в 07:52
поделиться

Возможно, я ответил немного быстро, смотри в конце ...
Как это, это бесполезно для приложения .
Период!

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

  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 случай, когда я увидел бы какое-то использование, как оно есть ...
... чтобы иметь возможность поставить точку останова на линии повышения , чтобы получить возможность увидеть, что происходит в контексте этого блока кода.

2
ответ дан 6 December 2019 в 07:52
поделиться

Хорошо, действительно два вопроса здесь.

Во-первых, это имеет значение значимо : если execSQL выдает исключение, оно перехватывается блоком try и перенаправляется в исключение. Затем он передается при повышении до следующего более высокого блока.

Во-вторых, полезно ли это ? Возможно нет. Это почти наверняка является результатом одной из трех вещей:

  1. Кто-то с заостренными волосами написал стандарт кодирования, который сказал, что «все операции, которые могут вызвать исключение, должны быть в блоке try».
  2. Кто-то хотел вернуться и превратить исключения, сделанные из статуи execSQL , в другое, более значимое исключение.
  3. Кто-то новичок не знал, что написанное им было изоморфно тому, что среда uter беспокоилась об исключении, и поэтому подумал, что они должны переслать его.
2
ответ дан 6 December 2019 в 07:52
поделиться

На самом деле, я должен опубликовать это как комментарий к ответам Франсуа, но я не знаю, возможно ли вставить туда отформатированный код :( Поэтому я публикую это как ответ.

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, но ... разве это не уродливо?

1
ответ дан 6 December 2019 в 07:52
поделиться

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

2
ответ дан 6 December 2019 в 07:52
поделиться

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

Но, может быть, Blorgbeard действительно хочет знать, так ли это вообще имеет смысл попробовать ... кроме рейза; Конец . В Delphi 7, если я правильно помню, Exit вызовет finally часть блока try-finally (как если бы это было какое-то исключение). Кто-то может посчитать такое поведение неуместным для своей задачи, и использование рассматриваемой конструкции - довольно обходной путь.

Только было бы странно использовать один рейз; там,

0
ответ дан 6 December 2019 в 07:52
поделиться

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

0
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: