“Плохой Ключ”. исключение при дешифровании с RSACryptoServiceProvider (C#.NET)

Выдача исключения из деструктора опасна.
, Если другое исключение уже распространяет приложение, завершится.

#include 

class Bad
{
    public:
        // Added the noexcept(false) so the code keeps its original meaning.
        // Post C++11 destructors are by default `noexcept(true)` and
        // this will (by default) call terminate if an exception is
        // escapes the destructor.
        //
        // But this example is designed to show that terminate is called
        // if two exceptions are propagating at the same time.
        ~Bad() noexcept(false)
        {
            throw 1;
        }
};
class Bad2
{
    public:
        ~Bad2()
        {
            throw 1;
        }
};


int main(int argc, char* argv[])
{
    try
    {
        Bad   bad;
    }
    catch(...)
    {
        std::cout << "Print This\n";
    }

    try
    {
        if (argc > 3)
        {
            Bad   bad; // This destructor will throw an exception that escapes (see above)
            throw 2;   // But having two exceptions propagating at the
                       // same time causes terminate to be called.
        }
        else
        {
            Bad2  bad; // The exception in this destructor will
                       // cause terminate to be called.
        }
    }
    catch(...)
    {
        std::cout << "Never print this\n";
    }

}

Это в основном сводится к:

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

деструктор тогда разрушит объект путем вызова этих методов (если пользователь не сделал так явно), но любой бросок исключений пойманы и отброшены (после того, как, пытаясь решить проблему).

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

пример:

станд.:: fstream

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

Поэтому, если пользователь объекта файла хочет сделать специальную обработку для проблем, связанных с закрытием файла, они будут вручную звонить близко () и обрабатывать любые исключения. Если, с другой стороны, они не заботятся тогда, что деструктор оставят обработать ситуацию.

у Scott Myers есть превосходная статья о предмете в его книге "Эффективный C++"

Редактирование:

, по-видимому, также в "Более эффективном C++"
Объект 11: Препятствуйте тому, чтобы исключения оставили деструкторы

8
задан Lazlo 7 September 2009 в 23:51
поделиться

1 ответ

Кажется, импортирования только D недостаточно. Я считаю, что вам нужно установить все следующие свойства:

  • Модуль
  • Показатель
  • Q
  • DP
  • DQ
  • InverseQ
  • D
0
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: