在某些情况下,错误是作为参数提供的,而不是引发错误。一个示例可以是其中提供Result<T, Error>
的完成处理程序。我想匹配错误而不抛出错误。
通过抛出错误进行匹配的示例:
enum MyError: Error {
case error
}
func process(error: Error) {
do {
throw error
} catch MyError.error {
print("this is it")
} catch {
print("unknown error")
}
}
process(error: MyError.error)
更新:
即使对于系统提供的错误(例如URLError
不是enum
类型的错误),匹配也应该起作用。
func process(error: Error) {
do {
throw error
} catch URLError.timedOut {
print("this is not it")
} catch URLError.cancelled {
print("this is it")
} catch {
print("unknown error")
}
}
process(error: URLError(.cancelled))
答案 0 :(得分:3)
您可以使用if case
语法。
在您的示例中,
enum MyError: Error {
case error
}
func process(error: Error) {
if case MyError.error = error {
print("this is it")
} else {
print("unknown error")
}
}
process(error: MyError.error)
答案 1 :(得分:1)
有几种方法可以匹配未引发的错误。使用import React, { Component } from 'react';
import { Text, PanResponder, Alert } from 'react-native';
import { ImagePicker, Permissions } from 'expo';
export default class App extends Component {
panResponder = PanResponder.create({
onStartShouldSetPanResponder: () => true,
onPanResponderGrant: e => {
this.start = e.nativeEvent.pageX;
},
onPanResponderRelease: e => {
if (this.start - e.nativeEvent.pageX > 100) {
Promise.all([
Permissions.askAsync(Permissions.CAMERA),
Permissions.askAsync(Permissions.CAMERA_ROLL),
]).then(([{ status: status1 }, { status: status2 }]) => {
if (status1 !== 'granted' && status2 !== 'granted') {
Alert.alert('Permission not granted');
return;
}
ImagePicker.launchCameraAsync().catch(e =>
Alert.alert('Failed to launch camera', e.message)
);
});
}
},
});
render() {
return (
<Text
{...this.panResponder.panHandlers}
style={{ flex: 1, paddingTop: '50%' }}>
Pan left to open camera
</Text>
);
}
}
语句可以使代码保持简单,并避免许多错误:
我现在已经更新了代码,以包含您所请求的switch
。
URLError