Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
 
  • Добежал (16.01.09 17:48) [0]
    Возникали споры, правомерно ли в некоторых случаях оставлять тело except пустым. Всегда находились те люди, которые утверждали, что тело пустым никогда не должно быть, ни при каких обстоятельствах, иначе это неправильно, как минимум нужно делать вывод в лог.

    Вот встретил в проекте хороший пример:

    var
     Document: IHTMLDocument2;
     Window: OleVariant;



    ...

    try
     Window:=Document.parentWindow;
     Window.before_print_script;
    except ;
    end;



    Смысл в том, что в HTML документе перед его печатью вызывается функция before_print_script (если она есть). По смыслу эту JS функция может выполнять всякие преобразования полезные (удобные) для печати. Но этой функции вполне может не быть, документ и так хорошо для печати подходит, но движок программы знать этого не может.

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

    Или у приверженцев теории, что except низачто нельзя оставлять пустым, есть противо аргументы? Интересно.
  • Ганя (16.01.09 17:51) [1]
    По хорошему, такие ситуации надо разруливать не try-except' ом, а IF'ом
    IF before_print_script_Exists then ...
  • Игорь Шевченко © (16.01.09 17:54) [2]

    > Или у приверженцев теории, что except низачто нельзя оставлять
    > пустым, есть противо аргументы? Интересно.


    Ты тролль ?
  • Добежал (16.01.09 18:00) [3]

    > По хорошему, такие ситуации надо разруливать не try-except'
    > ом, а IF'ом


    ну я тоже об этом думал. Но судя по всему в данной ситуации хрен это проверишь.
  • Mystic © (16.01.09 18:06) [4]
    Все равно исключение должно иметь свой тип. И исключение ловить только на вызов, где оно может возникнуть. Так что лучше написать


    Window:=Document.parentWindow;
    try
    Window.before_print_script;
    except
     on E: EOleError do ;
    end;

  • Медвежонок Пятачок © (16.01.09 18:11) [5]
    try
    adoconnection.open();
    Result := True;
    except
    try
     adoconnection.open('user','password');
     result := True;
    except
     on E:Exceptiuon do ....
    end;
    end

    В контексте вопроса верхний блок - пустой.
    и все логично.
  • Медвежонок Пятачок © (16.01.09 18:23) [6]
    в параметрах подключения кнопка для adodb.prompdatasource и возможность ввести имя пароль.

    я не знаю, какая строка подключения будет у юзера. с паролем и именем или с использованием nt аутентификации.

    если без нт, я не хочу парсить ее и вставлять логин/пароль. и не хочу допустим сохранять ее в настройках с паролем.

    отсюда такой двуступенчатый try/except

    и пустой верхний блок
  • oxffff © (16.01.09 18:34) [7]

    > Добежал   (16.01.09 17:48)  
    > Возникали споры, правомерно ли в некоторых случаях оставлять
    > тело except пустым


    Все правомерно!!!

    result:=CONST_EXCEPTION;
    try
    ...........
    IF WorkDoneWell then result:=CONST_OK
     else result:=CONST_NOT;
    except
    end;
  • Юрий Зотов © (16.01.09 19:16) [8]
    > oxffff ©   (16.01.09 18:34) [7]
    > Все правомерно!!!

    Только кривовато немного, вот так посимпатичнее будет:

    try
     if WorkDoneWell then
       result := CONST_OK
     else
       result := CONST_NOT;
    except
     result := CONST_EXCEPTION;
    end;


    > All

    Как показывает этот и многие другие примеры, при правильном кодинге необходимость оставлять секцию except пустой просто не возникает.
    :о)
  • Добежал (16.01.09 19:22) [9]

    > при правильном кодинге необходимость оставлять секцию except
    > пустой просто не возникает


    ну тогда как "правильно" переписать пример?

    try
     Window:=Document.parentWindow;
     Window.before_print_script;
    except ;
    end;



    Ведь здесь как видно секция except пустая оказалась.
  • oxffff © (16.01.09 19:25) [10]

    > Юрий Зотов ©   (16.01.09 19:16) [8]
    > > oxffff ©   (16.01.09 18:34) [7]
    > > Все правомерно!!!
    >
    > Только кривовато немного,


    Кривость насколько я понял состоит в том, что обращение к result при нормальном режиме 2 раза?


    > Как показывает этот и многие другие примеры, при правильном
    > кодинге необходимость оставлять секцию except пустой просто
    > не возникает.
    > :о)


    Как показывает этот и многие другие примеры, подходов к программированию может быть не один.

    try
    if WorkDoneWell then
      result := CONST_OK
    else
      result := CONST_NOT;
    exit;
    except
    end;
    result := CONST_EXCEPTION;
  • Ega23 © (16.01.09 19:33) [11]

    function TURSCmdMngr.OnAccUsrChangePwd2(Request: TFCGIRequest): Integer;
    var
     param : TFCGIParameter;
     OldPwd, NewPwd : string;
    begin
     Result := rrDataError;
     try
       param := Request.FCGParams.ParamByName(wc_OldPwd);
       if param=nil then Exit;
       OldPwd := param.AsString;

       param := Request.FCGParams.ParamByName(wc_NewPwd);
       if param=nil then Exit;
       NewPwd := param.AsString;

       StreamWriteString(Request.InData, OldPwd, ACU_AccUsrOldPwd);
       StreamWriteString(Request.InData, NewPwd, ACU_AccUsrNewPwd);

       Result := rrOK;
    except on E : Exception do
       OnException('TURSCmdMngr.OnAccUsrChangePwd2 : ' + E.Message);
     end;
    end;

  • oxffff © (16.01.09 19:38) [12]

    > Юрий Зотов ©   (16.01.09 19:16) [8]
    > > oxffff ©   (16.01.09 18:34) [7]
    > > Все правомерно!!!
    >
    > Только кривовато немного, вот так посимпатичнее будет:
    >
    > try
    >  if WorkDoneWell then
    >    result := CONST_OK
    >  else
    >    result := CONST_NOT;
    > except
    >  result := CONST_EXCEPTION;
    > end;


    Однако про кривость помогу так прокомментировать.
    При некоторых обстоятельствах(механизме информирования о результате) предварительная установка ошибки может быть более предпочтительная, чем уведомление об ошибки в момент ошибки(причем это не всегда возможно сделать сообщить об ошибке).
    Естественно речь идет не возврате через переменную, а например через callback процедуру.
  • b z (16.01.09 19:43) [13]

    > Ega23 ©   (16.01.09 19:33) [11]
    Это в защиту сабжа или против? :)
  • Anatoly Podgoretsky © (16.01.09 19:48) [14]
    Так этот код

    > try
    > if WorkDoneWell then
    >   result := CONST_OK
    > else
    >   result := CONST_NOT;
    > exit;
    > except
    > end;
    > result := CONST_EXCEPTION;

    равен этому
    result := CONST_EXCEPTION;

  • oxffff © (16.01.09 19:51) [15]

    > Anatoly Podgoretsky ©   (16.01.09 19:48) [14]


    Почему?

    try
    raise Exception.Create('none');
    if TRUE then showmessage('CONST_OK')
    else showmessage('NOT');
    exit;
    except
    end;
    showmessage('EXCEPTION');
    end;

    Закоментируйте и раскоментируйте
    raise Exception.Create('none');
  • oxffff © (16.01.09 19:54) [16]

    > Юрий Зотов ©   (16.01.09 19:16) [8]
    > > oxffff ©   (16.01.09 18:34) [7]
    > > Все правомерно!!!
    >
    > Только кривовато немного, вот так посимпатичнее будет:
    >
    > try
    >  if WorkDoneWell then
    >    result := CONST_OK
    >  else
    >    result := CONST_NOT;
    > except
    >  result := CONST_EXCEPTION;
    > end;


    Я в большинстве своего кода, именно так и пишу.
    Просто мне всегда интересно найти сходную альтернативу.
  • Ega23 © (16.01.09 20:04) [17]

    > Anatoly Podgoretsky ©   (16.01.09 19:48) [14]
    >
    > Так этот код
    >

    try
    if WorkDoneWell then
      result := CONST_OK
    else
      result := CONST_NOT;
    exit;
    except
    end;
    result := CONST_EXCEPTION;



    > равен этому


    result := CONST_EXCEPTION;

  • test (16.01.09 20:10) [18]
    А логи пишут только трусы? А обработка ошибок отменена указом президента?
  • oxffff © (16.01.09 20:16) [19]

    > test   (16.01.09 20:10) [18]
    > А логи пишут только трусы?


    Нет, только майки.
 
Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
Есть новые Нет новых   [134453   +33][b:0.001][p:0.002]