Как я могу поймать это исключение в списке инициализатора члена конструктора? [Дубликат]

Чтобы определить, почему код PHP не работает в коде JavaScript , нам нужно понять, что такое клиентский и серверный язык и как они работают.

Серверные языки (PHP и т. д.) : они извлекают записи из баз данных, поддерживают состояние через HTTP-соединение без состояния и выполняют много вещи, требующие безопасности. Они находятся на сервере, эти программы никогда не имеют своего исходного кода для пользователя

Image from wikipedia_http://en.wikipedia.org/wiki/File:Scheme_dynamic_page_en.svg [/g16] image attr

Хотя с другой стороны Клиентский язык на стороне клиента (например, JavaScript) находится в браузере и запускается в браузере, Сценарии на стороне клиента обычно относятся к классу компьютерных программ в Интернете, которые выполняются на стороне клиента, в веб-браузере пользователя, а не на стороне сервера .

JavaScript отображается пользователю и может быть легко изменен, поэтому для обеспечения безопасности мы не должны полагаться на JavaScript.

Итак, когда вы делаете запрос HTTP на сервере, чем сервер, сначала внимательно читает файл PHP, чтобы узнать, есть ли какие-либо задачи, которые необходимо выполнить, и отправлять ответ на клиентскую сторону и снова, как @deceze сказал * Как только PHP закончил вывод ответа, сценарий заканчивается, и на сервере ничего не произойдет, пока не появится новый запрос HTTP . *

Graphical representation [/g17]

Источник изображения

Итак, что мне делать, если мне нужно вызвать PHP? Это зависит от того, как вам это нужно: либо перезагружая страницу, либо используя вызов AJAX.

  1. Вы можете выполнить перезагрузку страницы и отправить запрос HTTP
  2. вы можете сделать вызов AJAX с помощью JavaScript, и это не требует перезагрузки страницы

Хорошо Чтение:

  1. Википедия:
  2. Википедия: скрипты на стороне клиента
  3. Мадара Учиха: разница между клиентской стороной и программированием на стороне сервера

45
задан Head Geek 1 October 2008 в 23:57
поделиться

5 ответов

Прочитайте http://weseetips.wordpress.com/tag/exception-from-constructor-initializer-list/ )

Редактирование: после более глубокого копирования, они называются «Блоки try функции».

Я признаюсь, что не знал об этом, пока не посмотрел. Вы узнаете что-то каждый день! Я не знаю, является ли это обвинительным актом о том, как мало я использую C ++ в наши дни, отсутствие знаний на C ++ или часто византийские функции, которые засоряют язык. Хорошо, мне все равно нравится:)

Чтобы люди не могли перейти на другой сайт, синтаксис функции try block для конструкторов оказывается:

C::C()
try : init1(), ..., initn()
{
  // Constructor
}
catch(...)
{
  // Handle exception
}
79
ответ дан Adam Wright 28 August 2018 в 04:13
поделиться
  • 1
    Ах ... это похоже на что-то! – Head Geek 2 October 2008 в 00:06
  • 2
    Тьфу. Я не удивлен, что есть способ сделать это, но это, безусловно, отличный пример того, почему я ненавижу синтаксис инициализатора C ++ ... – Mark Bessey 2 October 2008 в 00:07
  • 3
    ПРИМЕЧАНИЕ. Вы не можете обрабатывать исключение при использовании блоков try try для конструкторов. даже если ваш блок catch (...) не перебрасывается, исключение все же ускользает от вызывающего. – Aaron 2 October 2008 в 00:37
  • 4
    Д-р Dobbs подробно объяснил это: drdobbs.com/cpp/184401297 – jwfearn 2 October 2008 в 01:13
  • 5
    Херб Саттер «Гуру недели» статьи также хорошо обсуждают функции-try-blocks: gotw.ca/gotw/066.htm – Void 23 September 2009 в 21:12

Вы могли бы работать с ленивой инициализацией, тем не менее, это держать unique_ptr для Reader в MyClass и создавать его с новым. Таким образом, вам даже не нужен флаг has_reader, но вы можете просто увидеть, является ли ваш unique_ptr исходным или нет.

#include <iostream>
#include <memory>
using namespace std;

class MyOtherClass
{
public:
    MyOtherClass()
    {
        throw std::runtime_error("not working");
    }
};

class MyClass
{
public:
    typedef std::unique_ptr<MyOtherClass> MyOtherClassPtr;

    MyClass()
    {
        try
        {
            other = std::make_unique<MyOtherClass>();
        }
        catch(...)
        {
            cout << "initialization failed." << endl;
        }

        cout << "other is initialized: " << (other ? "yes" : "no");
    }

private:
    std::unique_ptr<MyOtherClass> other;
};

int main()
{
    MyClass c;

    return 0;
}

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

1
ответ дан IceFire 28 August 2018 в 04:13
поделиться

Я не вижу, как вы это сделаете с синтаксисом списка инициализаторов, но я также немного скептически отношусь к тому, что вы сможете сделать что-нибудь полезное, поймав исключение в своем конструкторе. Очевидно, это зависит от дизайна классов, но в каком случае вы не сможете создать «mB» и по-прежнему иметь полезный объект «A»?

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

0
ответ дан Mark Bessey 28 August 2018 в 04:13
поделиться

Это не особенно красиво:

A::A(const B& b) try : mB(b) 
{ 
    // constructor stuff
}
catch (/* exception type */) 
{
    // handle the exception
}
16
ответ дан Michael Burr 28 August 2018 в 04:13
поделиться

Я знаю, что прошло некоторое время, так как это обсуждение началось. Но эта конструкция try-and-catch, упомянутая Адамом, является частью стандарта C ++ и поддерживается Microsoft VC ++ и GNU C ++. Вот программа, которая работает. Кстати, улов автоматически генерирует другое исключение, чтобы сигнализировать о сбое конструктора.

#include <iostream>
#include <exception>
#include <string>

using namespace std;

class my_exception: public exception
{
  string message;
public:
  my_exception(const char* message1)
  {
    message = message1;
  }

  virtual const char* what() const throw()
  {
     cout << message << endl;
     return message.c_str();
  }

  virtual ~my_exception() throw() {};
};

class E
{
public:
    E(const char* message) { throw my_exception(message);}
};

class A
{
    E p;
public:
    A()
  try :p("E failure")
    {
            cout << "A constructor" << endl;
    }
  catch (const exception& ex)
    {
        cout << "Inside A. Constructor failure: " << ex.what() << endl;
    }
};


int main()
{
    try
    {
        A z;
    }
    catch (const exception& ex)
    {
        cout << "In main. Constructor failure: " << ex.what() << endl;
    }
    return 0;
}
4
ответ дан Mikhail Semenov 28 August 2018 в 04:13
поделиться
Другие вопросы по тегам:

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