我是dart编程的新手,所以我试图检查嵌套在FutureBuilder中的开关盒中的异常子类型,但我没有令人满意的解决方案...
我尝试检查开关盒,但不起作用,但是当我使用is
进行if-else时,它正在工作...
我的自定义Exception子类型:
class HttpException implements Exception {
HttpStatusError status;
String message;
HttpException(int statusCode) {
switch (statusCode) {
case 400:
this.status = HttpStatusError.BadRequest;
this.message = "Bad request";
break;
case 401:
this.status = HttpStatusError.UnAuthorized;
this.message = "UnAuthorized access ";
break;
case 403:
this.status = HttpStatusError.Forbidden;
this.message = "Resource access forbidden";
break;
case 404:
this.status = HttpStatusError.NotFound;
this.message = "Resource not Found";
break;
case 500:
this.status = HttpStatusError.InternalServerError;
this.message = "Internal server error";
break;
default:
this.status = HttpStatusError.Unknown;
this.message = "Unknown";
break;
}
}
enum HttpStatusError {
UnAuthorized,
BadRequest,
Forbidden,
NotFound,
InternalServerError,
Unknown
}
if (snapshot.hasError) {
final error = snapshot.error;
print(error is HttpException);
switch (error) {
case HttpException:
return Text("http exception";
case SocketException:
return Center(child: Text("socket exception"));
}
return Center(child: Text("Error occured ${snapshot.error}"));
}
打印指令:print(error is HttpException);
显示true
的值,但我不输入大小写SocketException
。
答案 0 :(得分:1)
根据Dart语言规范,这是不可能的。
Dart中的Switch语句使用==比较整数,字符串或编译时常量。被比较的对象必须全部是同一类的实例(而不是其任何子类型的实例),并且该类不得覆盖==。枚举类型在switch语句中工作良好。
在您的自定义异常中,您在switch case块中使用整数,这是有效的数据类型。但是在底部代码中,您尝试按类型切换,不支持。 也许您可以尝试将这些类转换为字符串,但这会增加复杂性。
https://dart.dev/guides/language/language-tour#switch-and-case
另一种方法可能是使用pythonic
方法来实现切换情况。
它使用map / dictionary,其中的键是大小写,值是要返回的值,可能是示例中的提供程序。