Dart基础-控制流程与异常处理

简介: <div class="markdown_views"><h2 id="控制流程语句">控制流程语句</h2><p>你可以通过以下方法控制代码流程</p><ul><li>if和else</li><li>for循环</li><li>while和do-while循环</li><li>break和continue</li><li>switch和case</li>

控制流程语句

你可以通过以下方法控制代码流程

  • if和else
  • for循环
  • while和do-while循环
  • break和continue
  • switch和case
  • assert

你也可以使用try-catch和throw处理异常

if和else

dart支持if语句和可选的else语句,简单的if语句可以用条件运算符( ? : ),下面是例子

if (isRaining()) {
  you.bringRainCoat();
} else if (isSnowing()) {
  you.wearJacket();
} else {
  car.putTopDown();
}

for循环

你可以使用for循环进行迭代

var message = new StringBuffer("Dart is fun");
for (var i = 0; i < 5; i++) {
  message.write('!');
}

如果对象是一个iteration对象,你可以使用forEach()方法

candidates.forEach((candidate) => candidate.interview());

iteration类List和Set使用for-in的形式

var collection = [0, 1, 2];
for (var x in collection) {
  print(x);
}

while和do-while

while循环先判断条件再进入循环

while (!isDone()) {
  doSomething();
}

do-while先进入循环再判断条件

do {
  printLine();
} while (!atEndOfPage());

break和continue

使用break停止循环

while (true) {
  if (shutDownRequested()) break;
  processIncomingRequest();
}

使用continue跳过本次循环

for (int i = 0;i < candidates.length;i++) {
  var candidate = candidates[i];
  if (candidate.yearsExperince < 5) {
    continue;
  }
  candidate.interview();
}

switch和case

switch通常用于整数、字符串和编译时常量的比较,比较的对象必须是同一类的实例,而不是任何子类型,每一个case必须用break结束。

在没有case匹配的情况下执行default的内容

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
  }

下面例子中的case省略了break,因此产生了一个错误

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    //错误:缺少break导致异常!

  case 'CLOSED':
    executeClosed();
    break;
}

然而,在case内容为空的情况下支持落空

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
  case 'NOW_CLOSED':
    executeNowClosed();
    break;
}

如果你真的希望落空,你可以使用continue继续执行

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;

nowClosed:
  case 'NOW_CLOSED':
    executeNowClosed();
    break;
}

assert

使用assert语句,如果布尔值为false就扰乱正常运行,只在检查模式下工作

//确保变量非空
assert(text != null);

//确保值小于100
assert(number < 100);

//确保这是一个https URL
assert(urlString.startsWith('https'));

异常处理

dart会抛出并捕获异常,异常表示一些意想不到的事情发生了,如果没有捕获异常,就会中断运行或程序结束,与java不同,dart的所有异常都是未经检查的,dart提供了Exception和Error类型,以及众多预定义的子类型,你也可以自己定义异常

throw

这是个抛出异常的例子

throw new FormatException('Expected at least 1 section');

你还可以抛出任意对象

throw 'Out of llamas!';

因为抛出异常是一个表达式,你可以用 => statements 在任何地方抛出异常

distanceTo(Point other) => throw new UnimplementedError();

catch

捕捉或捕获异常阻止异常继续运行,捕获异常并处理

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

代码可以有多个类型的异常处理,你可以指定多个异常处理,第一个catch子句处理异常对象的类型,如果catch子句没有指定异常类型,就处理所有异常类型

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  //指定的异常
  buyMoreLlamas();
} on Exception catch (e) {
  //所有异常
  print('Unknown exception: $e');
} catch (e) {
  //没有指定类型,处理所有异常
  print('Something really unknown: $e');
}

看上面的代码,你可以使用on和catch或两者都用,使用on指定异常类型,使用catch给异常处理程序一个异常对象

finally

确保代码的运行,不管是否抛出异常,使用finally子句,无论是否有匹配异常的catch子句,最终都执行finally子句

try {
  breedMoreLlamas();
} finally {
  //总是执行,即使抛出异常
  cleanLiamaStalls();
}

匹配任何异常catch子句后运行finally子句

try {
  breedMoreLlamas();
} catch(e) {
  //首先处理异常
  print('Error: $e');
} finally {
  //然后执行
  cleanLiamaStalls();
}
目录
相关文章
|
6月前
|
Go 开发者
Go语言中的错误处理与异常机制:实践与最佳策略
【2月更文挑战第7天】Go语言以其独特的错误处理机制而闻名,它鼓励显式错误检查而不是依赖于异常。本文将探讨错误处理与异常机制在Go语言中的实际应用,并分享一些最佳实践,帮助开发者编写更加健壮和易于维护的Go代码。
|
6月前
|
Swift
Swift的控制流语句
Swift的控制流语句
62 3
|
3月前
|
算法 测试技术 Go
|
6月前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
62 0
Java一分钟之-控制流程:if条件语句与switch
|
6月前
|
NoSQL 测试技术 C++
C++的异常处理及错误调试技巧
C++的异常处理及错误调试技巧
79 0
|
6月前
|
Go 开发者
Go语言中的异常处理
【2月更文挑战第22天】
50 3
|
6月前
|
编译器 Go 索引
go语言控制流
go语言控制流
47 0
一文搞懂Go语言错误处理【异常捕获、异常抛出】
一文搞懂Go语言错误处理【异常捕获、异常抛出】
一文搞懂Go语言错误处理【异常捕获、异常抛出】
|
Java UED
异常处理:让你的代码更加健壮
异常处理:让你的代码更加健壮
110 0
|
Go
Go编程模式 - 4.错误处理
如何Wrap Error,在多人协同开发、多模块开发过程中,很难统一。而一旦不统一,容易出现示例中的过度Unwrap的情况。
36 0