Flex(try-catch-finally)机制

本文探讨了Flex中的异常处理机制,并对比了try...catch与监听器的不同应用场合。实验表明,某些异常只能通过监听器捕获,且异常捕获的效果受运行环境的影响。此外,文章还列举了一些关于不同运行环境下异常捕获的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  http://www.adobe.us/livedocs/flex/3_cn/langref/sta tements.html Flex try catch API>最近在使用中发现了flex异常捕捉的一个很奇特的地方,进行了多次试验,在此做个小小的总结:
  测试代码如下:
  Mxml代码 layout="absolute" creationComplete="init()">
  这里的xml文件"aaa.xml"是不存在的,如果按照java异常捕捉的习惯这里应该是会被捕捉的。可是在flex是用情况中,结果却是依然弹出错误提示"Error #2044: 未处理的 ioError:。 text=Error #2032: 流错误"。
  经在网上求证,可信的说法为flex的异常不是都能用try...catch捕捉的,像上面的情况必须使用监听器来使用,确实让人郁闷。
  下面就来加个监听器捕捉下这个异常,测试代码如下: Mxml代码
   layout="absolute" creationComplete="init()">
  运行这个测试代码,果真可以捕捉。看来flex的异常需要在逻辑上分成两种分别对待捕捉呵呵。
  注:在测试的过程中我还发现了一个很特别的现象,现将测试结果记录在此:
  在只是用try...catch捕捉上面的那种异常情况下。
  测试环境为:window xp,flash 9,Adobe Flex Builder 3(以下简称fb3),tomcat5.5
  1.在fb3中直接运行bin-debug目录下的swf文件,异常是捕捉不到的。
  2.bin-debug目录下的swf文件不在非fb3中直接点击运行异常是可以捕捉到的。
  3.在fb3中直接运行bin-release目录下生成的swf,异常是可以捕捉的。
  4.bin-release目录下生成的swf在非fb3中直接点击运行异常是可以捕捉到的。
  5.两个目录下的swf文件放在web服务器下通过ie访问,异常都不可以捕捉的。
  6.两个目录下的swf文件放在web服务器下通过firefox访问,异常是可以捕捉的。
  看来flex对运行平台的依赖还会很强的,还是用标准的监听去捕捉异常吧
<script setup lang="ts"> import { userService } from '@/api/service/user' import avatar from '@/assets/images/avatar.webp' import { useAppStore, useMenuStore } from '@/store' import { User } from '@element-plus/icons-vue' import { useRouter } from 'vue-router' import apps from '~icons/custom/apps' import exit from '~icons/custom/exit' import unlock from '~icons/custom/unlock' import ChangePasswordDialog from './change-password/index.vue' import UserInfo from './user-info/index.vue' import VOYAHlogo from '/Vhome.svg' defineOptions({ name: 'LayoutHeader', }) // 修改密码的窗口是否可见 const changePasswordDialogVisible = ref(false) // 个人信息的窗口是否可见 const checkUserInfoVisible = ref(false) const appStore = useAppStore() const { isEnglish: _isEnglish, } = storeToRefs(appStore) const router = useRouter() const userInfoRef = ref() function redirectGlobal() { router.push({ name: 'Dashboard' }) } async function handleCommand(command: string | number | object) { switch (command) { case 'logout': { try { await ElMessageBox.confirm( '确认要注销吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', }, ) await userService.logout() localStorage.setItem('token', '') window.$message.success('注销成功') router.push({ name: 'Login' }) } catch (error) { console.error(error) window.$message?.error('注销失败,请重试') } break } case 'modifyPwd': { changePasswordDialogVisible.value = true break } case 'userInfo': { checkUserInfoVisible.value = true userInfoRef.value.open() break } default: break } } const userInfo = ref<any>({ avatar: '', username: '', roleName: '', mobile: '', roleNameList: [], source: '', email: '', }) const menuStore = useMenuStore() const { filterMenu } = menuStore onActivated(async () => { getUserInfoFn() }) onMounted(() => { getUserInfoFn() }) async function getUserInfoFn() { const { data } = await userService.getUserInfo() userInfo.value = data filterMenu(userInfo.value.roleIdList) } </script> <template> <div class="h-full flex items-center"> <div class="flex items-center justify-between wh-full"> <div class="h-full flex items-center gap-x-4"> <el-image class="wh-8" :src="VOYAHlogo" fit="scale-down" @click="redirectGlobal" /> <span class="header-title text-4 color-[#1A253B] font-bold leading-5.5"> {{ $t('system.title') }} </span> <el-divider direction="vertical" style="height: 22px; margin:0;" /> <el-button text circle> <el-icon size="20"> <apps /> </el-icon> </el-button> </div> <div class="header-right-content-wrapper flex items-center gap-x-4"> <!-- <el-button circle> <el-icon :size="16"> <GlobalSearch /> </el-icon> </el-button> --> <!-- 国际化 --> <!-- <el-button circle @click="appStore.toggleLang()"> <el-icon :size="16"> <translate /> </el-icon> </el-button> --> <!-- 主题模式 --> <!-- <el-button circle> <el-icon :size="16"> <Theme /> </el-icon> </el-button> --> <!-- 通知公告 --> <!-- <el-badge is-dot> <el-button circle> <el-icon :size="16"> <notification /> </el-icon> </el-button> </el-badge> --> <!-- 设置 --> <!-- <el-button circle> <el-icon :size="16"> <GlobalSetting /> </el-icon> </el-button> --> <!-- 用户中心 --> <el-popover popper-class="user-center w-50" popper-style="width: 200px; padding: 0;" placement="bottom" :show-arrow="false" > <template #reference> <el-avatar :src="userInfo.avatar" :size="40" class="cursor-pointer" /> </template> <template #default> <div class="user-center-content"> <div class="user-info h-30 flex flex-col items-center p-4"> <el-avatar :src="userInfo.avatar" :size="40" class="cursor-pointer" /> <span class="mt-2 text-sm color-[#262626] leading-5">{{ userInfo.username }}</span> <span class="text-xs color-[#8C8C8C] leading-5">{{ userInfo.roleName }}</span> </div> <div class="operation flex flex-col p-4"> <el-button class="operation-btn" link @click="handleCommand('userInfo')"> <el-icon :size="20" class="mr-2"> <User /> </el-icon>个人信息 </el-button> <el-button class="operation-btn" link @click="handleCommand('modifyPwd')"> <el-icon :size="20" class="mr-2"> <unlock /> </el-icon>修改密码 </el-button> <el-divider class="operation-divider" /> <el-button class="operation-btn" type="danger" link @click="handleCommand('logout')"> <el-icon :size="20" class="mr-2"> <exit /> </el-icon>退出系统 </el-button> </div> </div> </template> </el-popover> </div> </div> <ChangePasswordDialog v-model="changePasswordDialogVisible" /> <UserInfo ref="userInfoRef" v-model="checkUserInfoVisible" v-model:user-info="userInfo" @confirm-ok="getUserInfoFn" /> </div> </template> <style lang="scss" scoped> .header-title { font-family: Alimama ShuHeiTi; } .header-right-content-wrapper { .el-button + .el-button { margin-left: 0; } } </style> <style> .el-popper.el-popover.user-center { --el-popover-border-radius: 8px; background: url('@/assets/images/header/user-center-bg.webp'); background-position: center; background-size: auto 140%; background-repeat: no-repeat; border: none; box-shadow: 0px 8px 20px 0px rgba(31, 39, 51, 0.09); .operation { .operation-btn { height: 32px; margin-left: 0; } .operation-divider { margin: 12px 0; } } } </style> 为什么我修改完之后userInfo.avatar没有响应式更新啊?
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值