使用throw catch在Dart中处理错误。 (Catch似乎没有执行)

时间:2013-12-28 21:53:00

标签: dart dartium

我第一次尝试使用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

1 个答案:

答案 0 :(得分:1)

图像侦听器(onLoad,onError)是异步的。 MincraftSkin实例化完成没有任何错误,只有在加载图像资源或收到错误之后,才会抛出StateError,可能是几百毫秒之后。构造函数不会等待图像是否正确加载。