2014-11-23 3 views
2

Как я могу игнорировать ошибку msgbox, если файл uninstall.vsf не существует при вызове функции LoadVCLStyle_UnInstall в этом коде?Игнорировать сообщение об ошибке обработки ошибок?

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

// Import the LoadVCLStyle function from VclStylesInno.DLL 
procedure LoadVCLStyle_UnInstall(VClStyleFile: String); external '[email protected]{app}\uninstall.dll stdcall uninstallonly'; 

//E: Occurs when the uninstaller initializes. 
function InitializeUninstall: Boolean; 
begin 

    Result := True; 

    // Initialize the VCL skin style. 
    try 
    LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf')); 
    except 
    finally 
    end; 

end; 

enter image description here

+1

То, что вы видите, не является исключением, а поле сообщения ['показано'] (https://code.google.com/p/vcl-styles-plugins/source/browse/trunk/InnoSetup%20plugin/ VclStylesInno.dpr # 61), который плагин, когда возникает исключение. В этом случае вы можете обходным путем проверить, есть ли «FileExists» перед попыткой загрузить скин; с любым другим исключением, вам совершенно не повезло. DLL не должны вызывать никаких исключений, но не должны показывать никаких диалогов, когда они сталкиваются с некоторыми, ИМХО. Система «GetLastError» была бы лучше там. – TLama

ответ

0

возможность проверить на существование файла заранее уже было упомянуто.

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

Оператор EXCEPT сам по себе не обрабатывает исключение, он отмечает только точку, в которой выполнение программы должно продолжаться после возникновения ошибки. Когда исключение не обрабатывается/улавливается в блоке EXCEPT ... END, оно будет передано на следующий более высокий оператор EXCEPT. (Справочное руководство по Freepacal, глава 17)

Я также не думаю, что TRY ... EXCEPT ... FINALLY ... END будет работать. Либо EXCEPT, либо FINALLY, не оба.

Если вы хотите, чтобы захватить исключение вы должны сделать что-то вроде:

TRY 
    LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf')); 
EXCEPT 
    On EWhateverException DO ...; 
END; 

Если класс исключения этой ошибки не определен в документации, вы можете использовать следующий трюк, чтобы найти класс исключения имя:

TRY 
    LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf')); 
EXCEPT 
    ON Exception DO WriteLn(ExceptObject.ClassName); 
END; 

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

+1

Это неправильно. Вероятно, вы думали о конструкции типа 'on E: ExceptionClass do', где' E' - это переменная, которая получит объект исключения в блоке 'except'. Ну, ничто из этого не будет работать в скрипте Inno Setup Pascal. Более того, это не решит проблему с этим плагином (который просто показывает окно сообщения, это не исключение, возникшее в настройке). – TLama

+0

@TLama - Тогда почему TRY ... ЗА ИСКЛЮЧЕНИЕМ поддерживается? – Kitana

+2

Тот факт, что классы исключений и конструкторы 'on' не поддерживаются, не означает, что бессмысленно иметь блоки try .except. Вам не нужно фильтровать определенные классы исключений в блоках 'except' (это необязательно). Наконец, обработка исключений в сценарии OP не имеет ничего общего с полем сообщения, которое отображается в вопросе. Ответ на этот вопрос заключается в том, что окно сообщения отображается этим плагином, когда в нем возникает исключение; блок 'try..except' не будет отображаться. Он жестко закодирован в этом плагине. – TLama

Смежные вопросы