2015-08-18 2 views
0

У меня есть часть устаревшего кода, написанного в Delphi, задолго до того, как я объединил компанию, и поведение моей IDE заставляет меня сомневаться в моих собственных навыках.исключение, определяемое приложением (код 0x0eedfade) после фактического исключения

После загрузки DLL и закрепляющих функций OpenDB, GetError и GetErrorStr из DLL, этот код вызывается:

If @OpenDB <> nil then 
begin 
    DB_num := OpenDB((PAnsiChar(file))); 
    if DB_num = -1 then 
    begin 
    err := GetError; 
    ErrorString := GetErrorString(err); 
    raise Exception.Create(ErrorString); 
    Exit; 
    end 
end else 
    Exit; 

OpenDB возвращает -1 и GetErrorString возвращает сообщение об ошибке и исключение. Нет большого количества, существуют неисправные базы данных, и ошибки всегда могут произойти. Что меня заставляет, так это то, что после исключения возникает сообщение «... исключение приложения (код 0x0eedfade) в ...» всплывает. После этого я получаю нарушения доступа.

+0

Трудно прокомментировать без контекста. –

+0

Скорее всего, повреждение памяти. –

+0

Подождите, так что, после того, как исключение будет поднято, вы увидите всплывающее сообщение о том, что возникло исключение? Что еще вы ожидаете? –

ответ

2

Сообщение об ошибке означает, что вы поднимаете исключение Delphi через границы модуля в кусок кода, который не знает, как обрабатывать исключения Delphi. 0x0EEDFADE - это значение, которое оператор Delphi raise переходит к параметру dwExceptionCode функции Win32 RaiseException(). Только RTL Delphi и C++ Builder знают, как обращаться с такими исключениями. Вы никогда не должны создавать исключение через границы модулей, потому что один модуль не знает, может ли его использовать другой модуль. Различные модули могут быть написаны на разных языках/фреймах.

+0

Действительно. Если возможно, [НИКОГДА НЕ ПОЗВОЛЯЙТЕ ИСКЛЮЧЕНИЮ ЭЛЕМЕНТОВ DLL] (http://praxis-velthuis.de/rdc/articles/articles-cppobjs.html#exceptions). –

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