请老师帮忙看看:为什么不能捕获到404错误呢?

请老师帮忙看看:为什么不能捕获到404错误呢?

<!DOCTYPE html>
<html>

<head lang="en">
<meta charset="UTF-8">
<title>5-3</title>
<!-- https://class.imooc.com/lesson/1639#mid=38986 -->
<style>
#box {
width: 80vw;
height: 50vh;
margin: 0 auto;
}

#box img {
width: calc(1/3*100%);
}
</style>
</head>

<body>
<div id="box">

</div>
<script>
//补充代码
const box = document.getElementById('box')

const imgs = [
'http://img1.sycdn.imooc.com/climg//5b16558d00011ed5060003382.jpg', //故意将第一个图片的地址写错,前面的路径要写对,只是后面的图片名字加了个2
'http://img1.sycdn.imooc.com/climg//5b165603000146ca06000338.jpg',
'http://img1.sycdn.imooc.com/climg//5b1656140001c89906000338.jpg',
]

const loadImgAsync = url => {
return new Promise((resolve, reject) => {
const img = new Image()
img.onload = () => {
const imgDOM = document.createElement('img')
imgDOM.src = img.src
box.appendChild(imgDOM)
setTimeout(() => resolve(), 1000)
}
// onerror事件不能捕获到404错误??
img.onerror = () => {
reject(new Error(`Couldn't load the image at ${url}`))
}
try {
//这里如果出现404错误,并不会被捕获到??
img.src = url
} catch (err) {
reject(`The picture url ${url} is not right!`)
}
})
}

loadImgAsync(imgs[0]).then(() => {
return loadImgAsync(imgs[1])
}).then(() => {
return loadImgAsync(imgs[2])
}).catch(err => console.error(`错误 ${err}`))
</script>
</body>

</html>

http://img1.sycdn.imooc.com//climg/604e17b509c1006016262462.jpg


http://img1.sycdn.imooc.com//climg/604e1802097225c619921320.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,解答如下:

1、try catch 不能捕获图片的404错误,只有当try中的代码出现问题时,才会被catch捕获,例如:

http://img1.sycdn.imooc.com//climg/604ec74409af076806030224.jpg

http://img1.sycdn.imooc.com//climg/604ec74c09a89d0b07860134.jpg

2、我们想要的图片虽然是404,但是该图片的地址还有有返回内容的,即返回了另一张图片:

http://img1.sycdn.imooc.com//climg/604ec7930938e43114120699.jpg

所以不会触发img.onerror事件。如果图片地址没有返回内容,例如:

http://img1.sycdn.imooc.com//climg/604ec7be09e1b2fe05580183.jpg

http://img1.sycdn.imooc.com//climg/604ec7d209e7864810790620.jpg

则会触发onerror事件:

http://img1.sycdn.imooc.com//climg/604ec7e10908b53606530224.jpg

http://img1.sycdn.imooc.com//climg/604ec7ff098fa4fc08220196.jpg

此处有些特殊,同学稍微注意一下就可以了。

祝学习愉快!

  • hustnzj 提问者 #1

    谢谢老师,看了老师的回答,我又测试了下,现在是这么理解的:

    1. 

    onerror事件不能捕获到404错误??(并不是,climg.mukewang.com 这个域名上的图片,如果找不到404了,那么还会返回一张默认的替代图片,因此不能触发img.onerror事件。换一个其他网站,就可以正常触发错误事件了,后面promise的catch也就可以正确捕获了。


    2. 

    try catch 只有当js代码本身有错误时,才能捕获到错误。而404,403之类的服务器返回的错误,并不会被捕获到


    http://img1.sycdn.imooc.com//climg/604ecbe309412c7b17542558.jpg

    2021-03-15 10:52:30
  • hustnzj 提问者 #2

    测试结果截图:
    http://img1.sycdn.imooc.com//climg/604ecc26097f2c8d19721406.jpg

    2021-03-15 10:53:35
好帮手慕久久 2021-03-15 11:42:54

同学你好,理解的是对的。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师