Flutter/Dart第13天:Dart错误处理
Dart官方文档:https://dart.dev/language/error-handling
重要说明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用情况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。
反常
和Java相同,Dart也能够抛出反常,也能够捕获反常。Dart反常假如未被捕获,简单导致进程挂起和导致程序退出。所以,咱们在编写Dart程序时,需求特别重视反常。
和Java不同的是,Dart中的反常全部都是未检测反常。假如一个办法没有声明任何类型的反常,那么咱们就无需捕获该办法的反常。
Dart供给了Exception
和Error
两种反常的根底类型,一起内置了其他一些它们的子类。咱们也能够界说咱们自己的反常类型,Dart能够把任何非空的目标当作反常抛出,且这些目标类型纷歧定是Exception
或Error
类型的子类(和Java有很大差异)。
throw抛出反常
Dart能够把使命非空目标当作反常抛出,但主张抛出的反常为Exception
或许Error
的子类,下面是几个代码样例:
throw FormatException('Expected at least 1 section');
throw 'Out of llamas!';
void distanceTo(Point other) => throw UnimplementedError();
catch捕获反常
捕获反常,一般有种意图:一是为了阻挠反常持续传达,二是咱们希望从头抛出反常。
捕获反常的语法有几种:
- on 反常类型 catch(反常目标)
- catch(反常目标)
- catch(反常目标, 反常仓库)
捕获反常后,咱们能够进行一些处理。咱们能够依据反常类型,捕获多个反常。反常句子中若未界说反常类型,则捕获一切反常,如下代码样例:
try {
breedMoreLlamas();
} on OutOfLlamasException {
// `OutOfLlamasException`类型的反常
buyMoreLlamas();
} on Exception catch (e) {
// `Exception`类型的反常
print('Unknown exception: $e');
} catch (e) {
// 其他的一切的反常
print('Something really unknown: $e');
}
反常仓库类型StackTrace
类型,如下代码样例:
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
rethrow从头抛出反常
如下代码样例,当捕获到反常之后,能够经过rethrow
从头抛出反常:
void misbehave() {
try {
dynamic foo = true;
print(foo++); // 制作反常
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // 从头抛出反常
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
finally子句
当咱们不管是否有反常产生,都行履行某个逻辑时,咱们可用运用finally
子句。当产生反常时,首要履行catch
子句进行捕获,若未被捕获或许从头抛出反常,那么这个反常会在履行完fianlly
之后被抛出。
try {
breedMoreLlamas();
} finally {
// 不管是否有反常产生,均会履行本逻辑
cleanLlamaStalls();
}
try {
breedMoreLlamas();
} catch (e) {
// 首要:捕获反常
print('Error: $e');
} finally {
// 然后:履行本逻辑
cleanLlamaStalls();
}
断语
在使用的开发阶段,经过成果为false
的断句子子(如:assert(<condition>, <optionalMessage>);
句子)来阻断程序履行。几种断句子子的代码样例:
// `text`不能为null
assert(text != null);
// `number`有必要小于100
assert(number < 100);
// `urlString`有必要以`https`最初
assert(urlString.startsWith('https'), 'URL ($urlString) should start with "https".');
断语失利(表达式成果为false
)时,抛出AssertionError
类型(Error
类型的子类)的反常。
断语在以下场景下会收效:
- Flutter使用程序在debug形式(开发阶段,敞开了断语)。
- 类似于webdev等开发东西,默许敞开了断语。
- 类似于
dart run
和dart compile js
等东西,且经过命令行增加了--enable-asserts
敞开断语参数。
而在出产阶段,断语相关代码被疏忽,因而断语会失效(不会履行)。
我的本博客原地址:https://ntopic.cn/p/2023101401