老师,try..catch怎么理解,在if...else里面判断了,为什么外面要加上try...catch

老师,try..catch怎么理解,在if...else里面判断了,为什么外面要加上try...catch

<template>

<div class="wrapper">

<img class="wrapper__img" src="http://www.dell-lee.com/imgs/vue3/user.png">

<div class="wrapper-form">

<div>

<input

class="wrapper__name"

type="text"

placeholder="请输入用户名"

v-model="data.username"

>

</div>

<div>

<input

class="wrapper__pas"

type="password"

placeholder="请输入密码"

v-model="data.password"

>

</div>

<button class="loginBtn" @click="handelClick">登陆</button>

<div class="reg-fpas">

<span class="registerBtn" @click="handelRegister">立即注册</span>

<span class="line">|</span>

<span class="fpasBtn">忘记密码</span>

</div>

</div>

</div>

</template>

<script>

//从vue路由导入useRouter方法

import { useRouter } from 'vue-router'

//导入axios

//import axios from 'axios'

import {post} from '../../axios/request'

import {reactive} from 'vue'

//设置Content-Type

//axios.defaults.headers.post['Content-Type'] = 'application/json';

export default {

name:'LoginPage',

components:{},

setup(){

const router = useRouter();

const data =reactive({

username:'',

password:''

})

//点击立即注册,跳转到注册页面

const handelRegister=()=>{

router.push({name: 'Register'})

}

//const handelClick=()=>{

//发送登陆请求,将用户名和密码发送给后台

// axios.post(

//     'https://www.fastmock.site/mock/ae8e9031947a302fed5f92425995aa19/jd/api/user/login',

//     {

//         username:data.username,

//         password:data.password

//     }

// ).then(()=>{

//     localStorage.setItem('isLogin',true);

//     //登录态为true,执行下一步跳转

//     router.push({name: 'Home'})

// }).catch(()=>{

//     alert('登陆失败')

// })

//}

const handelClick = async()=>{

try{

//result是结果集合

const result = await post('/api/user/login',

{

username:data.username,

password:data.password

}

)

//console.log(result)

//?. 是ES2020(ES11)新特性,意思是尝试访问对象的属性之前检查对象是否存在,

//防止在对象不存在时访问属性导致代码报错

if(result?.errno===0){

localStorage.setItem('isLogin',true);

//登录态为true,执行下一步跳转

router.push({name: 'Home'})

}else{

alert('登陆失败')

}

}catch(e){//如果接口请求失败,就可以在这里捕获

alert('请求失败')

}

}

return{ handelRegister,handelClick,data}

}

}

</script>

<style lang="scss" scoped>

.wrapper{

position:absolute;

top:50%;

left:0;

right:0;

transform: translateY(-50%);

&__img{

width:.56rem;

height:.56rem;

display: block;

margin:0 auto .4rem;


}

input{

width:2.95rem;

height:.48rem;

background: #F9F9F9;

border: 1px solid rgba(0,0,0,0.10);

border-radius: .06rem;

text-indent: .16rem;

font-size:.16rem;

display:block;

margin:0 auto .16rem;

outline: none;

}

.loginBtn{

width:2.95rem;

height:.48rem;

background: #0091FF;

box-shadow: 0 .04rem .08rem 0 rgba(0,145,255,0.32);

border-radius: .04rem;

color:#fff;

border:none;

outline: none;

font-size:.16rem;

display: block;

margin:.32rem auto .16rem;

}

.reg-fpas{

display:flex;

justify-content:center;

font-size: .14rem;

color: #777;

.line{

margin:0 .12rem;

}

}

}

</style>


正在回答

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

1回答

同学你好,解答如下:

有一些“错误”,是接口可以处理的,它会通过返回信息告诉前端哪里有问题,比如“用户名错误”,此时可以用if else判断:

https://img1.sycdn.imooc.com//climg/62902dd609a99cad06480172.jpg

但是,并不是所有错误都能被接口处理,比如代码写错了:

https://img1.sycdn.imooc.com//climg/62902e2809172f9807850300.jpg

这种“未知的错误(程序员未料到的错误)”,就需要try catch来处理。

try catch 和if else双重保险,能让代码容错率更高,即使发生了错误,也能被很好的处理,不会造成程序报错、瘫痪。

祝学习愉快!

  • 老师,这里的try ctach除了捕获语法错误外,可以处理axios请求失败态的错误吗,像请求超时或者请求的url错误


    2022-07-18 17:09:48
  • 同学你好,可以,自己也可以动手改写下代码,结合代码运行的效果,验证自己的猜想,加深记忆,以错误的url为例:

    1、不使用try...catch,如下:

    https://img1.sycdn.imooc.com//climg/62d528c8097fa6e106510213.jpg

    程序直接报错,代码不会继续往后执行,所以控制台不会输出不会输出12,如下:

    https://img1.sycdn.imooc.com//climg/62d528e30975c8c514930201.jpg

    2、使用try...catch捕获错误,如下:

    https://img1.sycdn.imooc.com//climg/62d5290709ce549107220204.jpg

    错误被捕获,不会影响程序的正常运行,控制台输出12,如下:

    https://img1.sycdn.imooc.com//climg/62d52933096994b212980212.jpg

    祝学习愉快~

    2022-07-18 17:34:45
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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