【问题标题】:Can browsers throw errors when trying to create a rendering context?尝试创建渲染上下文时浏览器会抛出错误吗?
【发布时间】:2016-04-18 22:57:52
【问题描述】:

以下代码会抛出错误吗?

var canvas = document.createElement("canvas");

var ctx = canvas.getContext("somethingwrong");

在 chromium 中,它只返回 null。

如果浏览器知道请求的渲染上下文会怎样? (如“webgl”或“experimental-webgl”)是否有可能出现错误异常?在铬中我无法引发这种行为。

换句话说:我是否需要将此代码包装在一个库中的 try/catch 中,以便干净地检查渲染上下文?

有没有办法将其客观化?例如。由一个 Web 服务尝试在不同浏览器中截取的代码并列出它们可能不同的结果。

【问题讨论】:

  • 是的,对我来说也是这样。但是可能有一个浏览器支持“2d”上下文而没有其他的。但即使我禁用 webgl,我也会得到 null 作为返回值。在创建过程中,我不确定是否会出现异常,因为 document.createElement("something") 对我来说返回 undefined 无一例外。
  • 不是骗子而是相关的,stackoverflow.com/questions/36565598/… 另外,这个事件确实存在的事实意味着是的,浏览器可以抛出错误。
  • 感谢您的链接。我知道“webglcontextcreationerror”事件。我不是 100% 确定这里的术语,但我认为这不会引发错误,因为我无法在另一个地方捕获它(使用 try/catch)。我想说,这是一个常规事件,有时被称为“...错误”。但是,如果我在这里错了,请有人纠正我,

标签: javascript canvas browser cross-browser


【解决方案1】:

如果请求的上下文不可用,或者画布已分配给不同类型的上下文,则返回 nullexpected behavior

如果不支持给定的上下文 ID,则返回 null,如果画布 已经用其他上下文类型初始化(例如尝试 在获取“webgl”上下文后获取“2d”上下文)。

有一些特殊情况可以抛出与代理场景相关的异常(同上):

如果setContext()transferControlToProxy() 方法已使用。

除此之外,即使浏览器可能支持某种类型的上下文,但如果内存等系统资源不足,则无法保证可以创建对象,在这种情况下会返回null

Here is an overview 在不同(常见)场景中将返回的内容。

因此,除非您使用代理传输(目前还没有得到广泛支持),否则您不需要将 try-catchgetContext() 一起使用。

提示:以后画布会得到一个属性probablySupportsContext(),可以在getContext()之前使用。这将执行这些测试并在不满足条件时返回 false(支持的上下文、已与不同的上下文类型一起使用、资源不足等):

var supported = canvas . probablySupportsContext(contextId [, ... ] )

如果使用相同的参数调用 getContext(),则返回 false 肯定返回 null,否则返回 true。

更新只是想详细说明一个特殊情况 - 对于供应商特定扩展,理论上可能会抛出异常,具体取决于该非常具体的扩展及其方式定义了它的行为。但这些都是并且不应被视为标准的一部分,并且由于它们在大多数情况下是实验性的,因此暗示了风险和非标准行为。

【讨论】:

  • 这篇文章很有帮助。它证实了我的猜测,这里不需要 try/catch(假设没有使用代理计算)。唯一的疑问仍然是“特定于供应商的扩展”,例如“experimental-webgl”。但可能其中的错误会被“webglcontextcreationerror”事件捕获。
  • 为了完整性:在 Khronos 组的官方 repo 中,用于创建 webgl 上下文的包装器确实使用了 try/catch。这让我感到疑惑。 github.com/KhronosGroup/WebGL/blob/master/sdk/demos/common/…
  • 我在 whatwg 邮件列表上看到一条评论,大意是旧版本的 Firefox 错误地在失败时从 getContext 抛出,在某些情况下,这可能解释了尝试/捕捉。据我所知,这不再可能。此外,您应该安全地保存引发的错误原因(在您的处理程序中)并立即使用它(在处理程序之外),因为事件是almost definitely raised synchronously
  • 我注意到 Tor 浏览器(一个 Firefox 分支)在尝试创建某些被阻止的 webgl 上下文时会抛出异常。
猜你喜欢
  • 2023-04-02
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2013-07-16
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多