如何检查飞镖开关情况下异常的子类型?



我是飞镖编程的新手,所以我试图检查嵌套在 FutureBuilder 中的开关案例中的异常子类型,但我无法获得令人满意的解决方案......

我试图检查开关盒,但它不起作用,但是当我尝试使用 if-else 时is它正在工作......

我的自定义异常子类型:

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

根据Dart语言规范,这是不可能的。

Dart 中的 switch 语句使用 == 比较整数、字符串或编译时常量。比较的对象必须都是同一类(而不是其任何子类型的实例),并且该类不得覆盖 ==。枚举类型在开关语句中效果很好。

在自定义异常中,您在开关大小写块中使用整数,这是一个有效的数据类型。但是在底部代码中,您尝试按类型进行切换,这是不支持的。 也许您可以尝试将这些类转换为字符串,但这会增加更多复杂性。

https://dart.dev/guides/language/language-tour#switch-and-case

另一种方法是使用pythonic方式来实现开关情况。 这使用 map/字典,其中键是大小写,值是您要返回的值,可能是示例中的提供程序。

在Python 中替换 switch 语句?

最新更新