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

Android?Flutter中異常處理的方法總結(jié)

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

Flutter如何捕獲異常

程序異常會(huì)怎樣

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

flutter如何捕獲異常

Dart中可以通過(guò)try/catch/finally來(lái)捕獲代碼塊異常,這個(gè)和其它編程語(yǔ)言類似。

Flutter框架異常捕獲

Flutter 框架在很多關(guān)鍵的方法進(jìn)行了異常捕獲。

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

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

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

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

但如果想自己捕獲異常并上報(bào)到報(bào)警平臺(tái)的話應(yīng)該怎么做?進(jìn)入_debugReportException()方法看看:

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

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

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

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

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

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

其它異常捕獲與日志收集

在Flutter中,還有一些Flutter沒(méi)有為我們捕獲的異常,如調(diào)用空對(duì)象方法異常、Future中的異常。

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

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

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

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

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

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

下面是攔截應(yīng)用中所有調(diào)用print輸出日志的行為。

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

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

onError:Zone中未捕獲異常處理回調(diào),如果開(kāi)發(fā)者提供了onError回調(diào)或者通過(guò)ZoneSpecification.handleUncaughtError指定了錯(cuò)誤處理回調(diào),那么這個(gè)zone將會(huì)變成一個(gè)error-zone,該error-zone中發(fā)生未捕獲異常(無(wú)論同步還是異步)時(shí)都會(huì)調(diào)用開(kāi)發(fā)者提供的回調(diào),如:

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

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

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."); });

總結(jié)

最終異常捕獲和上報(bào)代碼如下:

void collectLog(String line){
    ... //收集日志
}
void reportErrorAndLog(FlutterErrorDetails details){
    ... //上報(bào)錯(cuò)誤和日志邏輯
}
FlutterErrorDetails makeDetails(Object obj, StackTrace stack){
    ...// 構(gòu)建錯(cuò)誤信息
}
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);
    },
  );
}

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

相關(guān)文章

  • Kotlin方法與Lambda表達(dá)式實(shí)踐使用介紹

    Kotlin方法與Lambda表達(dá)式實(shí)踐使用介紹

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

    Android布局生成分享圖片代碼實(shí)例

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

    Android 滑動(dòng)返回Activity的實(shí)現(xiàn)代碼

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

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

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

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

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

    Android編程設(shè)計(jì)模式之中介者模式詳解

    這篇文章主要介紹了Android編程設(shè)計(jì)模式之中介者模式,結(jié)合實(shí)例形式詳細(xì)分析了Android中介者模式的概念、原理、使用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2017-12-12
  • Android BroadcastReceiver廣播注冊(cè)方式總結(jié)

    Android BroadcastReceiver廣播注冊(cè)方式總結(jié)

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

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

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

    Android應(yīng)用自動(dòng)跳轉(zhuǎn)到應(yīng)用市場(chǎng)詳情頁(yè)面的方法

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

    Android仿QQ、微信聊天界面長(zhǎng)按提示框效果

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

最新評(píng)論

达孜县| 白河县| 江川县| 苍山县| 同仁县| 广宗县| 瑞昌市| 年辖:市辖区| 普宁市| 波密县| 盐池县| 包头市| 大名县| 咸阳市| 个旧市| 陆川县| 宿迁市| 富阳市| 九江市| 城固县| 永川市| 崇义县| 木里| 尼勒克县| 信阳市| 教育| 方城县| 定西市| 西峡县| 江达县| 呼和浩特市| 临洮县| 巨鹿县| 奉新县| 探索| 章丘市| 枣强县| 徐汇区| 德江县| 麻阳| 郓城县|