Выдавание исключения от конструкторов

Первый блок вашей конфигурации установлен неправильно. Предполагается, что линия listen 443 находится на втором блоке. Попробуйте эти конфигурации.

server {
    listen 80;
    server_name myapp.com www.myapp.com;
    server_tokens off;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl; # managed by Certbot
    server_name myapp.com www.myapp.com;

    ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot  

    root /home/me/myapp/src/myapp;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /home/me/myapp/src/myapp;
    }

    location /media/  {
        root /home/me/myapp/src/myapp;
    }

    location / {
        try_files $uri $uri/ @python_django;
    }

    location @python_django {
        proxy_pass http://127.0.0.1:8001;
        proxy_pass_request_headers on;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}
265
задан Guy Avraham 2 October 2018 в 01:52
поделиться

6 ответов

Да, исключение из отказавшего конструктора является стандартным способом сделать это. Прочтите этот FAQ о Обработка конструктора, который завершается ошибкой для получения дополнительной информации. Наличие метода init () также будет работать, но каждый, кто создает объект мьютекса, должен помнить, что init () должен быть вызван. Я чувствую, что это противоречит принципу RAII .

249
ответ дан 23 November 2019 в 02:28
поделиться

It is OK to throw from your constructor, but you should make sure that your object is constructed after main has started and before it finishes:

class A
{
public:
  A () {
    throw int ();
  }
};

A a;     // Implementation defined behaviour if exception is thrown (15.3/13)

int main ()
{
  try
  {
    // Exception for 'a' not caught here.
  }
  catch (int)
  {
  }
}
14
ответ дан 23 November 2019 в 02:28
поделиться

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

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

34
ответ дан 23 November 2019 в 02:28
поделиться

Если вы бросаете исключение из конструктора, имейте в виду, что вам нужно использовать синтаксис try / catch функции, если вам нужно перехватить это исключение в списке инициализатора конструктора.

например,

func::func() : foo()
{
    try {...}
    catch (...) // will NOT catch exceptions thrown from foo constructor
    { ... }
}

против

func::func()
    try : foo() {...}
    catch (...) // will catch exceptions thrown from foo constructor
    { ... }
97
ответ дан 23 November 2019 в 02:28
поделиться

The only time you would NOT throw exceptions from constructors is if your project has a rule against using exceptions (for instance, Google doesn't like exceptions). In that case, you wouldn't want to use exceptions in your constructor any more than anywhere else, and you'd have to have an init method of some sort instead.

3
ответ дан 23 November 2019 в 02:28
поделиться

Хотя я не работал с C ++ на профессиональном уровне, на мой взгляд, все же можно генерировать исключения из конструкторов. Я делаю это (при необходимости) в .Net. Проверьте эту и эту ссылку. Это может вас заинтересовать.

-1
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

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