Повторное использование кода в обработке исключений

Поскольку Angular использует Typescript, ответ - да: ознакомьтесь со следующим руководством: https://www.typescriptlang.org/docs/handbook/classes.html

. специальные правила для наследования компонентов (шаблон и стиль не будут наследоваться), проверьте это: https://scotch.io/tutorials/component-inheritance-in-angular-2

15
задан Laserallan 11 May 2009 в 10:19
поделиться

6 ответов

Вы можете использовать только одну функцию-обработчик для всех возможных исключений и вызывать ее из каждой или вашей функции реализации API, как показано ниже:

int HandleException()
{
    try 
    {
        throw;
    }

    // TODO: add more types of exceptions

    catch( std::bad_alloc & ) 
    {
       return ERROR_BAD_ALLOC;
    }
    catch( ... )
    {
        return ERROR_UNHANDLED_EXCEPTION;
    }
}

И в каждой экспортированной функции:

try
{
    ...
}
catch( ... )
{
    return HandleException();
}
28
ответ дан 1 December 2019 в 01:39
поделиться

А как насчет:

try{
    //Your code here
} catch(std::exception e)
{
   return translateExceptionToErrorCode(e);
} catch(...)
{
   return UNKNOWN_EXCEPTION_THROWN;
}
1
ответ дан 1 December 2019 в 01:39
поделиться

Никогда не используйте catch (...) , если только вы не планируете более или менее немедленный повторный бросок. Вы наверняка потеряете любую информацию об ошибке, которая могла бы помочь вам выяснить причину ошибки.

Мне немного больше нравится ваша вторая схема - ловите известный набор исключений, в идеале потому, что они единственные в вашем коде выбросит, а остальное пропустит - возможно, лучше всего разрешить сбой приложения, поскольку вы вызвали неизвестное поведение, поэтому лучше всего «аварийно завершить работу».

0
ответ дан 1 December 2019 в 01:39
поделиться

Было бы обидно потерять информацию об ошибке на границе языка. Вам действительно следует попытаться преобразовать все исключения в код ошибки, который можно использовать из C.

Как вы это делаете, действительно зависит от того, как выглядят ваши классы исключений. Если вы управляете иерархией классов исключений, вы можете гарантировать, что каждый класс предоставляет перевод с помощью виртуального метода. Если нет, вы все равно можете найти практичным использовать функцию-переводчик и протестировать типы исключений, производных от 'std :: exception', которые он получает, чтобы преобразовать его в код ошибки, во многом как предложил Джем (помните: выброшенные исключения повредят производительность в любом случае, поэтому не беспокойтесь о медленном переводе).

0
ответ дан 1 December 2019 в 01:39
поделиться

Ответ Джема немного проще, чем это решение. Но можно заменить использование макроса препроцессора использованием шаблонов. Примерно так (вы могли бы сделать больше уточнений):

template <class T, void (T::*FUNC)()>
class CatchWrapper
{
public:

    static void WrapCall(T* instance)
    {
        try
        {
            (instance->*FUNC)();
        }
        catch (std::bad_alloc&)
        {
            // Do Something 1
        }
        catch (std::exception& e)
        {
            // Do Something 2
        }
        catch (...)
        {
            // Do Something 3
        }
    }
};


class Foo
{
public:
    void SomeCall()
    {
        std::cout << "Do Something" << std::endl;
    }
};


int main(int argc, char* argv[])
{
    Foo i;
    CatchWrapper<Foo, &Foo::SomeCall>::WrapCall(&i);
    return 0;
}
1
ответ дан 1 December 2019 в 01:39
поделиться

Хороший ответ уже есть. Но просто к сведению, это называется идиомой «диспетчер исключений», см. C ++ FAQ .

4
ответ дан 1 December 2019 в 01:39
поделиться