2016-04-18 39 views
5

以下代码是否会抛出错误?尝试创建渲染上下文时,浏览器会抛出错误吗?

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

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

在铬中,它只返回null。

如果所请求的渲染上下文对浏览器是已知的,情况如何? (如“webgl”或“experimental-webgl”)是否有可能发生错误异常?在铬中,我无法激起这种行为。

换句话说:我是否需要将这段代码封装在一个try/catch中,以清楚地检查渲染上下文吗?

有没有可能将物品化的方法?例如。通过尝试在不同浏览器中剪切代码的Web服务并列出其可能不同的结果。

+0

是的,对我来说它看起来也是这样。但可能有一个浏览器支持“2D”上下文,而没有其他的。但即使禁用webgl,我也会返回null作为返回值。创建时,我不确定是否可能有异常,因为document.createElement(“something”)对我来说没有异常返回undefined。 –

+0

不是一个笨蛋,但相关,http://stackoverflow.com/questions/36565598/webglcontextcreationerror-event-is-it-triggered-synchronously/36566263#36566263此外,这个事件确实存在的事实意味着是的,浏览器**可以**抛出一个错误。 – Kaiido

+1

感谢您的链接。我知道“webglcontextcreationerror”事件。我不是百分之百确定这里的术语,但我认为这并不是抛出一个错误,因为我无法在另一个地方看到它(用try/catch)。我会说,这是一个常规事件,这被定义为“......错误”。但请,有人纠正我,如果我在这里错了, –

回答

2

返回nullexpected behavior如果请求的情况下不可用,还是在画布已经被分配到不同类型的上下文:如果给定上下文ID不支持

返回null,如果画布 已经用其他上下文类型初始化(例如,在获得“webgl”上下文后尝试 以获取“2d”上下文)。

有特殊情况下的异常可能抛出相关的代理方案(同上):

抛出一个InvalidStateError异常,如果已经使用了setContext()transferControlToProxy()方法。

除此之外,即使浏览器可以支持特定类型的上下文没有保证的是,如果系统资源,例如存储器是低在这种情况下null将被返回的对象可以被创建。

Here is an overview将在不同(常见)情况下返回的内容。

http://i.imgur.com/zqeZxv8.png

所以,除非你正在使用代理转移(这不正是广泛支持在这个时候),你不需要使用try-catchgetContext()

提示:未来画布将获得一个属性probablySupportsContext(),它可以在getContext()之前使用。这将做这些测试并返回false如果条件不满足(支持的背景下,已经在不同的上下文类型,低资源等使用):

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

返回FALSE如果调用getContext()具有相同的参数会 肯定返回null,否则返回true。

更新只是想阐述一个特例 - 特定扩展它在理论上可能获得取决于非常特定的扩展,以及它如何定义自己的行为引发的异常供应商。但是这些不应该被视为标准的一部分,并且由于它们在大多数情况下都是实验性的,所以隐含了风险和非标准行为。

+0

这是一个非常有用的职位。它证实了我的猜测,即try/catch在这里是不必要的(假设没有使用代理计算)。唯一的疑问仍然是“特定于供应商的扩展”,比如“experimental-webgl”。但这些内部的错误可能会被“webglcontextcreationerror”事件捕获。 –

+0

只是为了完整:在Khronos组的官方回购中,用于创建webgl上下文的包装确实使用try/catch。这让我想知道。 https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/common/webgl-utils.js –

相关问题