最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?Flutter中異常處理的方法總結

 更新時間:2023年06月28日 08:59:01   作者:97令山  
這篇文章主要為大家詳細介紹了Android?Flutter中異常處理的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下

Flutter如何捕獲異常

程序異常會怎樣

  • 在Java中,程序發(fā)生異常且沒有被捕獲,那么程序將會終止。
  • 但在Dart或JavaScript中則不會,究其原因,這和它們的運行機制有關系,Java是多線程模型的編程語言,任意一個線程觸發(fā)異常且沒被捕獲時,整個進程就退出。
  • 但Dart和JavaScript不會,它們都是單線程模型,運行機制很相似(但有區(qū)別)。

flutter如何捕獲異常

Dart中可以通過try/catch/finally來捕獲代碼塊異常,這個和其它編程語言類似。

Flutter框架異常捕獲

Flutter 框架在很多關鍵的方法進行了異常捕獲。

舉一個例子,當布局發(fā)生越界或不合規(guī)范時,F(xiàn)lutter就會自動彈出一個錯誤界面,這是因為Flutter已經(jīng)在執(zhí)行build方法時添加了異常捕獲。

最終的源碼如下,具體看 ComponentElement 類中的 performRebuild() 方法。

@override
void performRebuild() {
  try {
    //執(zhí)行build方法  
    built = build();
  } catch (e, stack) {
    // 有異常時則彈出錯誤提示  
    built = ErrorWidget.builder(_debugReportException('building $this', e, stack));
  } 
}      

可以看到,在發(fā)生異常時,F(xiàn)lutter默認的處理方式是彈一個ErrorWidget

但如果想自己捕獲異常并上報到報警平臺的話應該怎么做?進入_debugReportException()方法看看:

FlutterErrorDetails _debugReportException(
  String context,
  dynamic exception,
  StackTrace stack, {
  InformationCollector informationCollector
}) {
  //構建錯誤詳情對象  
  final FlutterErrorDetails details = FlutterErrorDetails(
    exception: exception,
    stack: stack,
    library: 'widgets library',
    context: context,
    informationCollector: informationCollector,
  );
  //報告錯誤 
  FlutterError.reportError(details);
  return details;
}

發(fā)現(xiàn),錯誤是通過FlutterError.reportError方法上報的,繼續(xù)跟蹤:

static void reportError(FlutterErrorDetails details) {
  ...
  if (onError != null)
    onError(details); //調用了onError回調
}

發(fā)現(xiàn)onErrorFlutterError的一個靜態(tài)屬性,它有一個默認的處理方法 dumpErrorToConsole,到這里就清晰了,如果想自己上報異常,只需要提供一個自定義的錯誤處理回調即可,如:

void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    reportError(details);
  };
 ...
}

這樣就可以處理那些Flutter為我們捕獲的異常了,接下來看看如何捕獲其它異常。

其它異常捕獲與日志收集

在Flutter中,還有一些Flutter沒有為我們捕獲的異常,如調用空對象方法異常、Future中的異常。

在Dart中,異常分兩類:同步異常和異步異常,同步異??梢酝ㄟ^try/catch捕獲,而異步異常則比較麻煩,如下面的代碼是捕獲不了Future的異常的:

try{
    Future.delayed(Duration(seconds: 1)).then((e) => Future.error("xxx"));
}catch (e){
    print(e)
}

Dart中有一個runZoned(...) 方法,可以給執(zhí)行對象指定一個Zone。

  • Zone表示一個代碼執(zhí)行的環(huán)境范圍,為了方便理解,可以將Zone類比為一個代碼執(zhí)行沙箱,不同沙箱的之間是隔離的,沙箱可以捕獲、攔截或修改一些代碼行為。
  • 如Zone中可以捕獲日志輸出、Timer創(chuàng)建、微任務調度的行為,同時Zone也可以捕獲所有未處理的異常。
  • 下面看看runZoned(...)方法定義:
R runZoned<R>(R body(), {
    Map zoneValues, 
    ZoneSpecification zoneSpecification,
    Function onError,
}) 

zoneValues: Zone 的私有數(shù)據(jù),可以通過實例zone[key]獲取,可以理解為每個“沙箱”的私有數(shù)據(jù)。

zoneSpecification:Zone的一些配置,可以自定義一些代碼行為,比如攔截日志輸出行為等,舉個例子:

下面是攔截應用中所有調用print輸出日志的行為。

main() {
    runZoned(() => runApp(MyApp()), zoneSpecification: new ZoneSpecification(
        print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
          parent.print(zone, "Intercepted: $line");
        }),
    );
}

這樣一來,APP中所有調用print方法輸出日志的行為都會被攔截,通過這種方式,也可以在應用中記錄日志,等到應用觸發(fā)未捕獲的異常時,將異常信息和日志統(tǒng)一上報。ZoneSpecification還可以自定義一些其他行為,讀者可以查看API文檔。

onError:Zone中未捕獲異常處理回調,如果開發(fā)者提供了onError回調或者通過ZoneSpecification.handleUncaughtError指定了錯誤處理回調,那么這個zone將會變成一個error-zone,該error-zone中發(fā)生未捕獲異常(無論同步還是異步)時都會調用開發(fā)者提供的回調,如:

runZoned(() {
    runApp(MyApp());
}, onError: (Object obj, StackTrace stack) {
    var details=makeDetails(obj,stack);
    reportError(details);
});

結合上面的FlutterError.onError就可以捕獲我們Flutter應用中全部錯誤了!需要注意的是,error-zone內部發(fā)生的錯誤是不會跨越當前error-zone的邊界的,如果想跨越error-zone邊界去捕獲異常,可以通過共同的“源”zone來捕獲,如:

var future = new Future.value(499);
runZoned(() {
	var future2 = future.then((_) { throw "error in first error-zone"; });
	runZoned(() {
		var future3 = future2.catchError((e) { print("Never reached!"); });
	}, onError: (e) { print("unused error handler"); });
}, onError: (e) { print("catches error of first error-zone."); });

總結

最終異常捕獲和上報代碼如下:

void collectLog(String line){
    ... //收集日志
}
void reportErrorAndLog(FlutterErrorDetails details){
    ... //上報錯誤和日志邏輯
}
FlutterErrorDetails makeDetails(Object obj, StackTrace stack){
    ...// 構建錯誤信息
}
void main() {
  FlutterError.onError = (FlutterErrorDetails details) {
    reportErrorAndLog(details);
  };
  runZoned(
    () => runApp(MyApp()),
    zoneSpecification: ZoneSpecification(
      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
        collectLog(line); // 收集日志
      },
    ),
    onError: (Object obj, StackTrace stack) {
      var details = makeDetails(obj, stack);
      reportErrorAndLog(details);
    },
  );
}

到此這篇關于Android Flutter中異常處理的方法總結的文章就介紹到這了,更多相關Android Flutter異常處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Kotlin方法與Lambda表達式實踐使用介紹

    Kotlin方法與Lambda表達式實踐使用介紹

    這篇文章主要介紹了Kotlin方法與Lambda表達式實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Android布局生成分享圖片代碼實例

    Android布局生成分享圖片代碼實例

    這篇文章主要介紹了Android布局生成分享圖片,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Android 滑動返回Activity的實現(xiàn)代碼

    Android 滑動返回Activity的實現(xiàn)代碼

    這篇文章主要介紹了Android 滑動返回Activity的實現(xiàn)代碼的相關資料,這里是訪微信滑動返回主頁的功能,需要的朋友可以參考下
    2017-07-07
  • Kotlin Option與Either及Result實現(xiàn)異常處理詳解

    Kotlin Option與Either及Result實現(xiàn)異常處理詳解

    Kotlin異常處理,異常是在程序運行時可能發(fā)生的不必要的問題,并突然終止您的程序。異常處理是一個過程,使用它可以防止程序出現(xiàn)可能破壞我們代碼的異常
    2022-12-12
  • Android仿微信聯(lián)系人按字母排序

    Android仿微信聯(lián)系人按字母排序

    但凡涉及到聯(lián)系人界面,幾乎都是按照字母排序的,那么聯(lián)系人按字母排序是怎么實現(xiàn)的呢,下面小編就給大家詳解Android仿微信聯(lián)系人按字母排序,需要的朋友可以參考下
    2015-08-08
  • Android編程設計模式之中介者模式詳解

    Android編程設計模式之中介者模式詳解

    這篇文章主要介紹了Android編程設計模式之中介者模式,結合實例形式詳細分析了Android中介者模式的概念、原理、使用場景、用法及相關操作注意事項,需要的朋友可以參考下
    2017-12-12
  • Android BroadcastReceiver廣播注冊方式總結

    Android BroadcastReceiver廣播注冊方式總結

    這篇文章主要介紹了Android BroadcastReceiver廣播注冊方式總結的相關資料,需要的朋友可以參考下
    2017-01-01
  • Android性能優(yōu)化之JVMTI與內存分配

    Android性能優(yōu)化之JVMTI與內存分配

    這篇文章主要為大家介紹了Android性能優(yōu)化之JVMTI與內存分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Android應用自動跳轉到應用市場詳情頁面的方法

    Android應用自動跳轉到應用市場詳情頁面的方法

    最近在工作中遇到一個需求,推廣部門要求實現(xiàn)應用自動跳轉到應用市場詳情頁面,通過查找一些資料,實現(xiàn)出來了,覺得有必要整理下方便以后或者有需要的朋友們參考借鑒,下面來一起詳細看看Android應用自動跳轉到應用市場詳情頁面的方法吧。
    2016-12-12
  • Android仿QQ、微信聊天界面長按提示框效果

    Android仿QQ、微信聊天界面長按提示框效果

    最近在工作項目中要實現(xiàn)一個長按提示 “復制” 的功能,類似于QQ、微信聊天界面長按提示框效果,本來想偷懶在網(wǎng)上找個開源的項目用,但是看了好幾個都不是很滿意,所以就打算按照自己的思路來實現(xiàn)一個。下面分享給大家,有需要的朋友們可以參考借鑒。
    2016-11-11

最新評論

汶川县| 涞水县| 台中市| 潜江市| 裕民县| 南皮县| 苏尼特右旗| 黄龙县| 石渠县| 云浮市| 莆田市| 上虞市| 襄垣县| 伊通| 张掖市| 吉木乃县| 伊宁县| 清镇市| 抚松县| 思南县| 永吉县| 同仁县| 田林县| 沛县| 奎屯市| 云南省| 徐汇区| 麻江县| 五原县| 平远县| 南昌县| 江华| 射阳县| 三江| 常熟市| 高州市| 北辰区| 济宁市| 金平| 双城市| 鲁山县|