Не перехватывается ошибка(как сделать устойч. приложение)
От: Armastab  
Дата: 10.08.10 18:29
Оценка:
Здравствуйте,

У меня есть серверное приложение, которое в своем процессе запускает внешние объекты (plugin), загружаемые из dll. Внещний код выполняется в одном из рабочих потоков сервера. Необходимо защитить сервер от ошибок, которые могут быть в плагинах. Самая первая идея, которая пришла мне в голову — обернуть вызов внешнего кода в блок обработки исключений try-catch или __try-except .

Я столкнулся с кодом, который убивает приложение, но не отлавливается обработкой исключений. Вот пример такого кода:
//Необходимо компилировать с ключом /EHa
#include "stdafx.h"
#include "stdarg.h"
#include "excpt.h"
#include "windows.h"

void TestParamStr(_TCHAR* lpszParam,...)
{
    va_list args;
    va_start(args,lpszParam );

    TCHAR szBuf[256];
    szBuf[0]=TCHAR(0);
    _vstprintf_s(szBuf, 256, lpszParam, args);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int dwRes(0);
    __try
    {
        TestParamStr(_T("%d %d %"), 0);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        MessageBox(NULL, _T("Exception"), _T("Exception"), MB_OK);
        dwRes = 1;
    }
    return dwRes;    
}

Т.к. в строке параметров функции _vstprintf_s количество ожидаемых параметров превышает количество реально передаваемых — вываливается ошибка, которая не отлавливается ни __try — __except, ни try-catch, программа умирает .

Вопрос:
1) Как отловить такую ошибку или защитить приложение от таких ошибок ?
2) Как лучше реализовать защиту приложения от ошибок во внешнем коде ?
Приходит в голову вариант с созданием внешнего процесса, в кот. выполнять код (так, чтобы если внешний код убивает приложение, то вываливался бы только процесс-хостер внешнего кода), и организацией межпроцессного взаимодейтсвия, но этот путь видится мне достаточно трудоемким и непростым в реализации.

Спасибо,
Armastab.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.