我正在为我正在处理的基于Web的系统添加一个事件驱动的插件api。
我应该在try / catch中包装插件调用以确保它们不会崩溃,或者我应该将其留给插件开发人员来处理。
此外,有些插件可能会更改我传递的数据,我应该重新验证所有数据还是相信插件开发人员不要破坏任何内容?
答案 0 :(得分:9)
你不应该让程序崩溃。
如果您可以通过插件编写者保护自己免受无辜错误的侵害,那么应该这样做 - 通过处理异常和重新验证代码必须重用的修改数据。
当您发现问题(异常或格式错误的数据)时,您所做的事情 - 卸载插件并在重新加载之前不再使用它可能在生产模式下是明智的。对于插件开发人员来说,提供对出错的良好诊断是明智的 - 甚至可能对获得广泛认可至关重要(很多人为您编写插件)。如果其他程序员无法有效地解决问题,他们可能不会继续尝试。
答案 1 :(得分:3)
如果第三方应用程序崩溃或是否应该包含某种进程隔离,Windows应该崩溃吗?
如果插件崩溃,firefox会崩溃吗?
有你的答案。永远不要相信第三方对自己应有的工作。
答案 2 :(得分:1)
Firefox有一个很好的补充,它可以防止插件崩溃主应用程序(例如Flash)。
主要应用程序必须始终具有控制权。顾名思义,插件是其中之一,不应该能够阻止主+其他插件。此外,通过保持对插件的控制,主应用程序仍然可以向用户提供指示
保持控制使用户能够了解正在发生的事情以及由谁负责
在Firefox中我喜欢我能够知道谁尝试(某种程度)使应用程序崩溃。
通过这种方式,作为主要的应用程序开发人员,您不会因为一开始就没有做过的糟糕工作而受到批评。
至于数据控制
这取决于应用程序和数据类型。如果数据对其他插件和主应用程序本身有影响,则应对其进行控制,调整或修复。
答案 3 :(得分:1)
作为一个类比..你会接受任何用户数据而不验证它吗?
在这种情况下,我将try / catch视为用户验证的程序执行模拟
答案 4 :(得分:1)
当我们编写独立程序并通过使用某种全局try-catch防止它崩溃时,我们成功隐藏了错误细节,防止修复这些错误。通常,意外的未处理异常应该使程序崩溃。这是在抛出此类异常时调试此异常的方法,或者为事后调试生成故障转储。
显然,必须保护加载第三方插件的程序免受插件崩溃的影响。另一方面,让插件开发人员有机会修复他们的错误,让整个程序崩溃是个好主意。我会考虑为这样的程序添加一些特殊的运行模式,这可以帮助插件开发人员。当然,普通用户不应该使用这种模式。在正常模式下,我会捕获所有插件错误,防止托管程序崩溃,但应记录每个插件崩溃的最大可能细节。
答案 5 :(得分:0)
这个问题并没有真正与语言无关的答案,但我会假设该插件是某种dll。
如果您可以避免信任该插件,那么避免它会有一些潜在的好处。如果没有别的东西可以帮助隔离错误,它还可以为您的用户提供一些免受恶意插件的保护,并有助于提高应用程序的可靠性和健壮性。
但是,要避免信任插件是相当困难的。根据操作系统的不同,您是否可以在自己的进程中以最少的权限运行它,没有文件系统或套接字访问权限,对内存和CPU时间等资源的访问受限,如果监视器看起来没有响应则会监视它,并与您的进程通信只通过管道?如果没有,那么一些有缺陷的插件会找到破坏你下午的方法,这意味着无论你是否有意,你都“依赖”它的正确性。
捕获异常意味着您在一个应用程序线程中运行插件。所以你相信它。如果它能够执行某些特定于操作系统的操作,使内核以极端的偏见关闭您的进程,则无法“确保它不会崩溃”。
所有这一切 - 关于捕获异常的具体问题,当且仅当他们可以对他们做一些有用的事情时,调用者应该捕获异常。
如果插件正在执行非必要的操作(例如渲染网页的一个组件),或者如果插件正在执行对程序绝对必要的操作(例如,如果它是视频),我会抓住它们在命令行转码程序中的编解码器,也许我会捕获异常并在记录错误“责备”插件上的错误后重新抛出它。否则我将处理它与程序中的任何其他意外错误相同)。