Мониторинг обменных курсов валют
18c0693f

Обработка ошибок


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

FAILED() SUCCEEDED()

Принцип работы этих макросов очень прост и представлен ниже.

if ( FAILED()) // ошибка при выполнении команды ... else // команда завершилась успешно

Для второго макроса принцип действия будет противоположным.

if (SUCCEEDED ()) // команда завершилась успешно ... else // ошибка при выполнении команды

Ниже приведены некоторые примеры обработки ошибок.

C++

LPDIRECT3D9 direct3d = NULL; ... if( FAILED( direct3d -> CreateDevice( … ) ) ) { // обработка ошибки }

Pascal

var direct3d: IDirect3D9; ... if Failed ( direct3d.CreateDevice( … ) ) then begin // обработка ошибки end;

Можно осуществлять анализ ошибок через дополнительную переменную.

C++

HRESULT hr; hr = direct3d -> CreateDevice( … ); if( FAILED(hr) ) {

}

Pascal

var hr: HRESULT; … hr := direct3d.CreateDevice( … ); if Failed(hr) then begin

end

И еще один способ обработки ошибок заключается в сравнении результата вызова функции с константой D3D_OK.

C++

if ( direct3d -> CreateDevice( … ) != D3D_OK ) {

}

Pascal

if direct3d.CreateDevice( … ) <> D3D_OK then begin

end;

Следует также остановиться на обработке ошибок при компиляции шейдеров. Как мы помним, в одном из параметров функции D3DXCompileShaderFromFile(…) возвращается указатель на буфер ошибок. Ниже приводится программный код, позволяющий вывести на экран сообщение об ошибке, полученное от компилятора HLSL.

C++

if ( D3DXCompileShaderFromFile( "shader.psh", NULL, NULL, "main", "ps_2_0", 0, &Code, &BufferErrors, NULL) != D3D_OK ) { MessageBox(NULL, (const char*)BufferErrors->GetBufferPointer(), "Ошибка в шейдере!!!", MB_OK | MB_ICONEXCLAMATION); }

Pascal

if D3DXCompileShaderFromFile('shader.psh', nil, nil, 'Main','ps_2_0', 0, @Code, @BufferErrors, nil) D3D_OK then begin MessageBox(0, BufferErrors.GetBufferPointer, 'Ошибка в шейдере!!!', MB_OK or MB_ICONEXCLAMATION); end;

Такой информативный способ позволяет легко "увидеть" в какой именно строке шейдера допущена ошибка.






Самый выгодный курс обмена валюты