# Dart 基础_操作符&控制流&异常处理

# 异常处理

Dart 提供了throw, rethrow, try, catch, on, finally关键字让开发者抛出和捕获异常

# throw

Dart 提供两个类异常: ExceptionError, Dart 不仅可以抛出异常,还可以抛出任何不为null的对象

// 抛出异常
throw FormatException('Expected at least 1 section');

// 抛出不为null的对象
throw 'Out of llamas!';

# catchon

try {
    breedMoreLlamas();
} on OutOfLlamasException {
    // 捕获一个特定异常
    buyMoreLlamas();
} on Exception catch(e){
    // 捕获所有继承自Exception的异常,并拿到异常对象
    print('Unknown exception: $e');
} catch(e){
    // 捕获所有异常
    print('Somethinf really unknow: $e');
}

catch 拿到异常的堆栈信息

try{
    // ...
} on Exception catch(e){
    //...
} catch(e, s){
    print('Exception details: \n $e');
    print('Stack trace: \n $s');
}

# rethrow关键字

on, catch关键字捕获的异常会停止传播,如果需要异常继续传播,可以使用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() finish handling ${e.runtimeType}.');
    }
}

# finnaly 不管是否抛出异常finally都一定会执行

try{
    breedMoreLlamas();
}  catch(e){
    print('Error: $e');
} finally{
    // 就算抛出异常(程序中断执行),finnaly也会执行
    cleanLlamaStalls();
}