Как получить ошибку из пользовательской функции, которая вызывает оригинальную функцию?у вас есть лучшее предложение? - PullRequest
0 голосов
/ 14 февраля 2012

Как получить ошибку из пользовательской функции, которая вызывает оригинальную функцию?
У вас есть лучшее предложение?

Пользовательская функция TCreateFile
эта функция TCreateFile вызывает оригинальную функцию CreateFile.

 void* tCreateFile(const char* pFileName,
                  unsigned long dwDesiredAccess, 
                  unsigned long dwShareMode, 
                  unsigned long dwCreationDisp,
                  unsigned long dwFlagsAndAttr) // short version of CreateFile
{
           void* hnd = ::CreateFile(pFileName, 
                               dwDesiredAccess,
                               dwShareMode, 
                               NULL,
                               dwCreationDisp,
                               dwFlagsAndAttr, 
                               NULL); // real version of createfile

if(hnd == (void*)-1) ::SetLastError(::GetLastError());

return hnd;
}

Некоторая функция
эта функция проверяет, есть ли ошибка, если нет, запустите код

char* Function()
{

void* hfile = tCreateFile("C:\\Test.txt", 
                         (GENERIC_WRITE | GENERIC_READ),
                         (FILE_SHARE_READ | FILE_SHARE_WRITE),
                         OPEN_EXISTING, 
                         FILE_ATTRIBUTE_NORMAL);

if(hfile != (void*)-1) 
{
 code....
}
else
{
 return GetErrorMessage(::GetLastError());
}
}

Функция GetErrorMessage
если какая-то функция завершается ошибкой, функция GetErrorMessage возвращает строку ошибки

char* GetErrorMessage(unsigned long IsError)
{
 switch(IsError)
   {
   case 2L: // ERROR_FILE_NOT_FOUND
   {
   return "Warning: file not found!\n\nPlease check if the file exists and try again.";
   break;
   }
   case 32L: // ERROR_FILE_IN_USE
   {
   return "Warning: file in use!\n\nPlease close all applications that use the file.";
   break;
   }
   .....
   .....
   .....
  default:
   {
   return "Warning: unknown error!";
   break;
   }
  }
 }

1 Ответ

0 голосов
/ 14 февраля 2012

Я предполагаю, что void * происходит из-за того, что вы не знаете, какой тип ответа на ошибку будет возвращать исходная функция.

Однако указатели Void не являются безопасными по типу, и вы не можетеdynamic_cast <> пустота * либо.Похоже, что это может привести к некоторым повреждениям памяти.

Лучше всего было бы создать класс оболочки частичной специализации Error и реализовать там различные типы возвращаемых значений, а затем вернуть эту оболочку Error из вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...