如何在mapview.setRegion函数中捕获运行时异常

时间:2017-02-28 19:06:38

标签: ios swift swift3 mkmapview

我有一个名为alertMap的插座(MKMapView),在我的viewWillAppear我设置了alertMap的初始视图。

func centerMapOnLocation(_ location: CLLocation) -> Bool {
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 1.0, regionRadius * 1.0)

    alertMap.setRegion(coordinateRegion, animated: true)    // TODO: crash

    return true
}

有时在我的代码中(我不知道为什么,但这又是另一个问题...)我的位置坐标存储在我的API中,导致上面的函数崩溃。

我尝试了几种方法来“捕获”异常,但似乎不可能。

如何捕获此运行时错误。

错误读取:

2017-02-28 12:54:33.400319 myApp[10433:2647466] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid Region <center:+1197269.18497000, -7972692.46846000 span:+0.00895306, -0.62941112>'
*** First throw call stack:
(0x1869091b8 0x18534055c 0x186908e80 0x192bffa0c 0x1000bd77c 0x1000bc728 0x1000bd4c0 0x18c7d6754 0x18c7d64cc 0x18cb0cf04 0x18ca4ffdc 0x18ca41d50 0x18c7b10b4 0x1868b60c0 0x1868b3cf0 0x1868b4180 0x1867e22b8 0x188296198 0x18c8297fc 0x18c824534 0x100130530 0x1857c55b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

1 个答案:

答案 0 :(得分:3)

正如几位不同的人所指出的那样:

  1. 您不应该首先尝试忽略运行时异常。即使在Objective-C中,这应该被视为最后的手段。
  2. 即使您想忽略运行时异常,swift也不允许您这样做。
  3. 您需要做的是使用保护块验证数据,然后追溯到根源会导致您的问题,例如:

    func centerMapOnLocation(_ location: CLLocation) -> Bool {
        guard (-90.0 ... 90.0).contains(location.coordinate.latitude) else {
            print("Unexpected latitude value \(location.coordinate.latitude)")
            return false
        }
    
        guard (-180.0 ... 180.0).contains(location.coordinate.longitude) else {
            print("Unexpected longitude value \(location.coordinate.longitude)")
            return false
        }
    
        guard (0 ..< 10000.0).contains(regionRadius) else {
            print("Unexpected region radius \(regionRadius)")
            return false
        }
    
        let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 1.0, regionRadius * 1.0)
    
        alertMap.setRegion(coordinateRegion, animated: true)    // TODO: crash
    
        return true
    }