如何在 mapview.setRegion 函数上捕获运行时异常
How to catch runtime exception on mapview.setRegion function
我有一个名为 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 中是错误的,导致上面的函数崩溃.
我尝试了几种方法来"catch"异常,但似乎不可能。
如何捕获此运行时错误。
错误读取:
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
正如几个不同的人指出的那样:
- 您不应该首先尝试忽略运行时异常。即使在 Objective-C 中,这也应该被视为最后的手段。
- 即使您想忽略运行时异常,swift 也不允许您这样做。
您需要做的是使用保护块验证数据,然后追溯问题的根源,例如:
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
}
我有一个名为 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 中是错误的,导致上面的函数崩溃.
我尝试了几种方法来"catch"异常,但似乎不可能。
如何捕获此运行时错误。
错误读取:
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
正如几个不同的人指出的那样:
- 您不应该首先尝试忽略运行时异常。即使在 Objective-C 中,这也应该被视为最后的手段。
- 即使您想忽略运行时异常,swift 也不允许您这样做。
您需要做的是使用保护块验证数据,然后追溯问题的根源,例如:
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
}