如何在dart的切换案例中检查异常的子类型?

时间:2019-07-23 09:29:15

标签: flutter dart

我是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

1 个答案:

答案 0 :(得分:1)

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

  

Dart中的Switch语句使用==比较整数,字符串或编译时常量。被比较的对象必须全部是同一类的实例(而不是其任何子类型的实例),并且该类不得覆盖==。枚举类型在switch语句中工作良好。

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

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

另一种方法可能是使用pythonic方法来实现切换情况。 它使用map / dictionary,其中的键是大小写,值是要返回的值,可能是示例中的提供程序。

Replacements for switch statement in Python?