Первый блок вашей конфигурации установлен неправильно. Предполагается, что линия 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;
}
}
Да, исключение из отказавшего конструктора является стандартным способом сделать это. Прочтите этот FAQ о Обработка конструктора, который завершается ошибкой для получения дополнительной информации. Наличие метода init () также будет работать, но каждый, кто создает объект мьютекса, должен помнить, что init () должен быть вызван. Я чувствую, что это противоречит принципу RAII .
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)
{
}
}
Создание исключения - лучший способ справиться с ошибкой конструктора. В частности, вам следует избегать неполного конструирования объекта, а затем полагаться на пользователей вашего класса для обнаружения сбоя конструкции путем тестирования переменных типа флага.
В связи с этим, у вас есть несколько различных типов исключений для работы с мьютексом. ошибки меня немного беспокоит. Наследование - отличный инструмент, но его можно использовать слишком часто. В этом случае я бы предпочел одно исключение MutexError, возможно, содержащее информативное сообщение об ошибке.
Если вы бросаете исключение из конструктора, имейте в виду, что вам нужно использовать синтаксис 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
{ ... }
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.
Хотя я не работал с C ++ на профессиональном уровне, на мой взгляд, все же можно генерировать исключения из конструкторов. Я делаю это (при необходимости) в .Net. Проверьте эту и эту ссылку. Это может вас заинтересовать.