0

我是第一次尝试 Dart,但我无法让错误处理为我工作。这里有一些关于它的信息。

资源:

我想要它:

如果图像源返回 403 错误代码,则创建 MinecraftSkin 实例应引发 StateError。应在尝试创建 MineCraft 皮肤实例的 generateHead() 函数中处理异常。

它是怎样的:

如果代表 MineCraft 播放器皮肤的图像不存在(当图像源不存在并返回 403 时)代码在第 22 行停止(onError;我抛出 StateError)并打印到控制台“Breaking on exception: Bad状态:用户没有皮肤”。

但是,在 generateHead 的捕获中,没有执行任何操作。当我提示它时,它不会打印 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);
}

提前致谢!

真诚的,杰里米

4

1 回答 1

1

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

于 2013-12-28T23:06:11.710 回答