我第一次尝试使用Dart,我无法让错误处理为我工作。以下是有关它的一些信息。
资源:
我想要的方式:
如果图像源返回403错误代码,则使MinecraftSkin的实例应该抛出StateError。应该在generateHead()函数中处理异常,其中尝试生成MineCraft皮肤的实例。
如何:
如果不存在代表MineCraft播放器皮肤的图像(当图像源不存在并返回403时)代码在第22行停止(onError;我抛出StateError)并打印到控制台“Breaking on异常:状态不佳:用户没有皮肤“。
然而,在generateHead的catch中,没有任何东西被执行。当我提示它时,它不会打印StateError消息,也不会将StateError消息插入DOM中的选定元素。
代码
import 'dart:html';
class MinecraftSkin {
String user;
CanvasElement ce = new CanvasElement();
void _generateCanvas(Event e) {
CanvasRenderingContext2D ctx = ce.getContext('2d');
ctx.imageSmoothingEnabled = false;
ctx.drawImageScaledFromSource((e.target as ImageElement),8,8,8,8,0,0,ce.width,ce.height);
}
CanvasImageSource getHead() => ce;
String name() => user;
MinecraftSkin(String minecraftUser, num size) {
user = (minecraftUser == null) ? 'Notch' : minecraftUser;
ce.width = size;
ce.height = size;
ImageElement img = new ImageElement()
..onLoad.listen(_generateCanvas)
..onError.listen((_) => throw new StateError('User has no skin'));
img.src = "http://s3.amazonaws.com/MinecraftSkins/"+user+".png";
}
}
void generateHead(Event e) {
MinecraftSkin ms;
try {
ms = new MinecraftSkin((querySelector('#userName') as InputElement).value, 128);
} on StateError catch(se) {
print(se.message);
querySelector('#status').text = se.message;
}
CanvasElement cems = ms.getHead();
cems.id = "mc" + ms.name();
cems.title = "mc" + ms.name();
document.body.append(cems);
querySelector('#status').text = "Got head!";
}
void main() {
querySelector('#generateHead').onClick.listen(generateHead);
}
提前致谢!
此致Jeremy
答案 0 :(得分:1)
图像侦听器(onLoad,onError)是异步的。 MincraftSkin实例化完成没有任何错误,只有在加载图像资源或收到错误之后,才会抛出StateError,可能是几百毫秒之后。构造函数不会等待图像是否正确加载。