【问题标题】:Leaflet - Possible to catch exception thrown from applicationLeaflet - 可能捕获应用程序抛出的异常
【发布时间】:2016-04-22 05:11:00
【问题描述】:

我正在开发一个应用程序,用户可以在其中上传 KML 文件并使用 Leaflet、toGeoJSON 和 Angular-Leaflet-Directive 在屏幕上呈现路径。

我使用toGeoJSON.kml() 将 KML 文本转换为 GeoJSON 对象,然后将其传递给 Leaflet 进行渲染。如果 KML 有效,这将非常有效。但是,如果 KML 格式不正确,它就不能很好地工作。 toGeoJSON 继续将数据呈现到对象中,忽略发生的任何错误。

var pathData = toGeoJSON.kml(kmlDom);
var latlng = [];

for (var feature in pathData.features) {
    var paths = pathData.features[feature].geometry.coordinates;
    if (paths.length > 1) {
        for (var path in paths) {
           var prospectiveCoords = pathData.features[feature].geometry.coordinates[path];
           var coordinate = L.GeoJSON.coordsToLatLng(prospectiveCoords);
            latlng.push(coordinate);
        }
    }
}
try {
    map.fitBounds(latlng); //Instance of L.getMap()

    angular.extend($scope, {
        geojson : {
            data : pathData,
            style : {
                stroke : true,
                weight : 5
            }
        }
    });

} catch (e) {
    $log.error(e.message);
    $window.alert(e.message);
}

在我的具体问题中,如果pathData 变量中有错误,则会触发LatLng 第7 行中的异常:

L.LatLng = function (lat, lng, alt) {
    if (isNaN(lat) || isNaN(lng)) {
        throw new Error('Invalid LatLng object: (' + lat + ', ' + lng +   ')');
    } 

    ...

不幸的是,这个错误并没有被我的 catch 块捕获,Leaflet 继续渲染没有路径覆盖的地图图块,用户得到的唯一通知是在控制台内。我的目标是在上传无效文件时获得更明显的用户通知。

是否可以在应用层拦截错误?

【问题讨论】:

    标签: javascript error-handling try-catch leaflet


    【解决方案1】:

    这段代码是否在回调函数中?您是否通过 ajax 调用获取 geojson 数据?异步回调方法可能会非常棘手地进行错误捕获,并且不会按照预期的顺序进行。 这个之前的帖子很有意思: Catch statement does not catch thrown error

    【讨论】:

    • 嗯,有趣的建议。此代码位于 leafletData.getMap() 的承诺成功处理程序中,并且 geojson 数据来自非异步服务调用,因此理论上任何异步调用在此代码块执行时都已解决。我刚刚向各自的 github 存储库提出了这个问题,并将更新任何解决方案。
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多