Return code techniques - what do u prefer?
Here are the types of function return systems ive come across:
1) GetLastError()
"bool LoadBitmap(char szFile)"
If( ! LoadBitmap("MyBitmap.bmp") )
{
if(GetLastError() == ERR_NOTFOUND) msg("bitmap not found");
if(GetLastError() == ERR_FAILED) msg("bitmap invalid");
}
2) HRESULT
"HRESULT LoadBitmap(char szFile)"
HRESULT hr;
hr = LoadBitmap(char szFile);
if(FAILED(hr))
{
if(hr == DDERR_FILENOTFOUND) msg("bitmap not found");
if(hr == DDERR_BITMAPINVALID) msg("bitmap invalid");
}
With the HRESULT codes, is there a range of user-codes that I can use for my own functions so I can mix DirectX codes and my own defined codes?
You can also throw an exception.
I''m sure there is a region of HRESULT values that is unused, but using them for your own error codes is bad because you never know when HRESULTs might be changed by microsoft. HERSULT is just a typedef:
And the reason that MS did this is so they could hide the implementation of HRESULTs so they could change them without affecting all the code already in use.
I''m sure there is a region of HRESULT values that is unused, but using them for your own error codes is bad because you never know when HRESULTs might be changed by microsoft. HERSULT is just a typedef:
typedef LONG HRESULT;
And the reason that MS did this is so they could hide the implementation of HRESULTs so they could change them without affecting all the code already in use.
Ok, but say if I was to create a wrapper or a library, would it be wise to use my own error codes instead of using HRESULT?
For instance:
//header file
#define ERR_CANNOTFINDFILE 0x1000
#define ERR_INVALIDBITMAP 0x1001
// usage
DWORD dw;
dw = LoadBitmap(char szFile)
if(dw != ERR_OK)
{
if(dw == ERR_CANNOTFINDFILE ) msg("Cannot find file");
if(dw == ERR_INVALIDBITMAP ) msg("Invalid Bitmap");
}
For instance:
//header file
#define ERR_CANNOTFINDFILE 0x1000
#define ERR_INVALIDBITMAP 0x1001
// usage
DWORD dw;
dw = LoadBitmap(char szFile)
if(dw != ERR_OK)
{
if(dw == ERR_CANNOTFINDFILE ) msg("Cannot find file");
if(dw == ERR_INVALIDBITMAP ) msg("Invalid Bitmap");
}
Downloads, D3DXSprite tutorial, New platform game: .-= The ZeroOne Realm =-.
If i were you i''d make my own... using exceptions for fatal errors.
And for the love of god, dont implement a GetLastError() style approach. Horrid.
And for the love of god, dont implement a GetLastError() style approach. Horrid.
I do a kind of hybrid approach. I have a list of error constants, but usually use them through exceptions.
Personal preference, I guess.
Take care,
Bill
Edited by - Siebharinn on February 6, 2002 10:12:40 AM
const int E_FILENOTFOUND = 0x0001;if(!LoadBitmap("goober.bmp")) throw ResourceException(E_FILENOTFOUND, "goober.bmp");// although I'd just make my own LoadBitmap() that throws// a resource exception, so I could do this:try { LoadBitmap("one.bmp"); LoadBitmap("two.bmp"); LoadBitmap("three.bmp"); LoadSound("one.wav");}catch(ResourceException& re) { // handle the problem}
Personal preference, I guess.
Take care,
Bill
Edited by - Siebharinn on February 6, 2002 10:12:40 AM
I use try-throw-catch groups in nearly all of my code that is used in libraries, for return values i use a Defined error value usually something like LIB_ERROR -123456.
Then of course i''ll add a nice macro to the library to detect the error though i think using FAILED works fine because DX functions return negative values on a fail.
Inside non-library code i tend not to use ttc''s mainly because they take longer to implement thatn returning an int.
zipless
/* Ignorance is bliss, then you go and spoil it by learning stuff */
Then of course i''ll add a nice macro to the library to detect the error though i think using FAILED works fine because DX functions return negative values on a fail.
Inside non-library code i tend not to use ttc''s mainly because they take longer to implement thatn returning an int.
zipless
/* Ignorance is bliss, then you go and spoil it by learning stuff */
Just return a freaking int and define you errors in an h file or use a try catch with a catch for COM errors and a seperate catch for all other errors.
catch(_com_error &e)
{
TRACE( "Error:%08lx.\n", e.Error());
TRACE( "ErrorMessage:%s.\n", e.ErrorMessage());
TRACE( "Source:%s.\n", (LPCTSTR) _bstr_t(e.Source()));
TRACE( "Description:%s.\n", (LPCTSTR) _bstr_t(e.Description()));
}
catch(...)
{
\\whatever...
}
catch(_com_error &e)
{
TRACE( "Error:%08lx.\n", e.Error());
TRACE( "ErrorMessage:%s.\n", e.ErrorMessage());
TRACE( "Source:%s.\n", (LPCTSTR) _bstr_t(e.Source()));
TRACE( "Description:%s.\n", (LPCTSTR) _bstr_t(e.Description()));
}
catch(...)
{
\\whatever...
}
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement