Должен ли я позволить плагину аварийно завершить работу моего приложения? - PullRequest
6 голосов
/ 29 августа 2010

Я добавляю управляемый событиями плагин api в веб-систему, над которой я работаю.

Должен ли я обернуть вызовы плагинов в try / catch, чтобы убедиться, что они не потерпят крах, или я должен оставить это на усмотрение разработчиков плагинов.

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

Ответы [ 6 ]

9 голосов
/ 29 августа 2010

Вы не должны допустить сбой вашей программы.

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

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

3 голосов
/ 29 августа 2010

Должно ли Windows аварийно завершить работу в случае сбоя стороннего приложения или в нем должна быть какая-то изоляция процесса?

Должно ли аварийное завершение Firefox при сбое плагина?Никогда не доверяйте третьим лицам их работу, как они должны.

1 голос
/ 29 августа 2010

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

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

1 голос
/ 29 августа 2010

Как аналогия ... вы бы приняли какие-либо пользовательские данные без их проверки?

В этом случае я вижу try / catch в качестве аналога выполнения программы проверки пользователя

1 голос
/ 29 августа 2010

В Firefox есть приятное дополнение, которое не позволяет плагину аварийно завершить работу основного приложения (например, Flash).

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

  • удалить плагин
  • ищите альтернативу и т.д ...

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

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

Что касается контроля данных

Это зависит от приложения и вида данных. Если данные влияют на другие плагины и основное приложение, они должны контролироваться, корректироваться или исправляться.

0 голосов
/ 30 августа 2010

На этот вопрос не существует независимого от языка ответа, но я предполагаю, что плагин является своего рода dll.

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

Однако, довольно трудно избежать доверия к плагину.В зависимости от ОС, собираетесь ли вы запускать его в своем собственном процессе с минимальными привилегиями, без доступа к файловой системе или сокетам, ограниченным доступом к таким ресурсам, как память и процессорное время, монитором, который убьет его, если он окажется не отвечающим, связываясь с вашим процессомтолько через трубу?Если нет, то какой-нибудь глючный плагин найдет способ испортить ваш день, а это означает, что вы «полагались» на его правильность, независимо от того, намеревались вы это делать или нет.

Поймать исключения означает, что вы используете плагинв одной из тем вашего приложения.Итак, вы доверяете этому.Вы не можете «убедиться, что он не потерпит крах», если у него есть возможность сделать какую-то специфическую для ОС вещь, которая заставит ядро ​​закрыть ваш процесс с предубеждением.

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

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

...