react-native 无法处理 try catch 块中的错误

Posted

技术标签:

【中文标题】react-native 无法处理 try catch 块中的错误【英文标题】:react-native fail to handle error in try catch block 【发布时间】:2019-02-11 20:25:27 【问题描述】:

我正在尝试使用 fetch() 函数发送图像。显示红屏和。发送数据之前出现“没有这样的文件或目录”错误。 try catch 块没有处理这个错误。

019-02-11 22:35:00.375 [错误][tid:com.facebook.react.NetworkingQueue][RCTNetworking.mm:272] 错误处理请求正文:Error Domain=NSCocoaErrorDomain Code=260“文件“5325CBBA-340E-4227-AE17-5D42021DF648.jpg”不能 被打开,因为没有这样的文件。” UserInfo=NSFilePath=/Users/myuser/Library/Developer/CoreSimulator/Devices/9362AC50-7C82-4C8D-B686-39A6718CBA5F/data/Containers/Data/Application/64CD29E3-2BD9-4D9A-B168-4B12A848889C/Documents/images/ 5325CBBA-340E-4227-AE17-5D42021DF648.jpg, NSUnderlyingError=0x600003c0a790 错误域=NSPOSIXErrorDomain Code=2 "没有这样的文件或目录"

如何处理这个错误?

错误屏幕:https://i.hizliresim.com/bVvqrm.png

  VeriListele() 

    try 
      db.transaction((tx) => 
        tx.executeSql("select * from " + TABLO_DATA + " where " + ROW_GONDERILDI_ + "=0", [], (tx, results) => 
          console.log("Query completed2");

          // Get rows with Web SQL Database spec compliance.
          console.log(results.rows);
          var len = results.rows.length;
          const data = new FormData();
          for (let i = 0; i < len; i++) 
            try 
              let row = results.rows.item(i);
              console.log(row);
              var FotoString='';
              if (row.resim1!='' && row.resim1!='undefined') 
                var resimjson=JSON.parse(row.resim1);
                FotoString+='&photo[]='+row.resim1;
                data.append('photo1[]', 
                  uri: resimjson.uri,
                  type: resimjson.type, // or photo.type
                  name: 'photo'
                );
              
              if (row.resim2!='' && row.resim2!='undefined') 
                FotoString+='&photo[]='+row.resim2;
                var resimjson=JSON.parse(row.resim2);
                data.append('photo1[]', 
                  uri: resimjson.uri,
                  type:resimjson.type, // or photo.type
                  name: 'photo'
                );
              
              if (row.resim3!='' && row.resim3!='undefined') 
                FotoString+='&photo[]='+row.resim3;
                var resimjson=JSON.parse(row.resim3);
                data.append('photo1[]', 
                  uri: resimjson.uri,
                  type: resimjson.type, // or photo.type
                  name: 'photo'
                );
              
              if (row.resim4!='' && row.resim4!='undefined') 
                FotoString+='&photo[]='+row.resim4;
                var resimjson=JSON.parse(row.resim4);
                data.append('photo1[]', 
                  uri:resimjson.uri,
                  type: resimjson.type, // or photo.type
                  name: 'photo'
                );
              
              if (row.video!='' && row.video!='undefined') 
                FotoString+='&video[]='+row.video;
                var resimjson=JSON.parse(row.video);
                data.append('video1[]', 
                  uri: resimjson.uri,
                  type: resimjson.type, // or photo.type
                  name: 'video'
                );
              
              try 

               catch (error) 

              


          data.append('api_token', Global.GToken); // you can append anyone.
          data.append('resid', row.id); // you can append anyone.

          data.append('additional', row.ek_aciklama); // you can append anyone.

          data.append('issue_date', row.tarih.split(' ')[0]); // you can append anyone.
          try 
            fetch("https://myapi.com/add", 
              method: 'post',
              body: data
            ).then(function(response)
              console.log(response);
             var responseJson=JSON.parse(response._bodyText)
            //  console.log();

              console.log(response);
            //  console.log(responseJson);
            //  console.log(responseJson);
              if (responseJson.sonuc == 1) 
                db.transaction((tx1) => 
                  console.log(row.id);
                  tx1.executeSql("update " + TABLO_DATA + " set gonderildi=1 where id=" + row.id + "");
                );


               else if (responseJson.sonuc==0) 
                console.log('basarisiz');
                db.transaction((tx1) => 
                 // tx1.executeSql("update " + TABLO_DATA + " set gonderildi=1 where id=" + row.id + "");
                );
              
            ).catch(error =>console.log(error) )
           catch (error) 
            console.log('bb');
          




             catch (error) 
              console.log('ss');
            

          
        );
      );

     catch (error) 
      console.log('dd');
    
    //  const Veriler = await AsyncStorage.getItem(‘products’)
    

【问题讨论】:

您能否删除问题中注释掉的代码以使其更易于阅读? 另外,你能把你的错误屏幕附加到这篇文章吗?我没有打开那个链接,因为我不认识它。 不让我为新用户上传屏幕图像 我在该图像上得到了 403 【参考方案1】:

我看到有关丢失文件的错误日志,但看不到它与 fetch 调用有何关系。你在发布那个文件吗?如果是这样,你能在你的代码中澄清一下吗?

如果您没有在fetch 调用中使用该文件,那么您需要弄清楚它在哪里被使用以及为什么它不在那里。

仅供参考,您在fetch 之后有一个.catch,它会记录错误,然后防止任何fetch 错误被try/catch 捕获。

【讨论】:

给出错误,因为文件已被删除。如果文件已被删除,我想继续下一个过程而不是错误屏幕 你能在 for 循环中仔细检查你的 try/catch 块吗?那应该可以处理它,但是在循环结束时有一个额外的空 try/catch 块。 我试过但没有工作:(。在红色错误屏幕后打破循环 您是说在for 循环之后 出现错误屏幕吗?我假设在data.append() 中访问uri 时会发生这种情况。 是的,在 for 循环中运行 fetch() 代码后打开错误屏幕。尝试 catch 块不起作用。代码正在运行,但由于找不到文件而显示错误屏幕。

以上是关于react-native 无法处理 try catch 块中的错误的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 try-catch 处理未处理的 Promise Rejection

React-Native:无法触发 Native UIButton 触摸事件

异常处理

无法使用 try-catch 处理 SQL 异常 [重复]

try...catch 语句

无法使用 try 和 catch 处理 axios 中的 404 错误