html5异常页面相关知识
-
做HTML5页面你要懂得这些很多人问过我这个问题,而问这个问题的人基本上都是刚听说过HTML5,处在懵懂的阶段,他们往往会被一些网上炫酷页面所吸引,开始的目的也很简单,能通过自己的努力做出这些页面,而这些页面效果一般只要通过简单的html和css就能实现,但这仅仅是表面现象,做出来与做好是两码事。而要做好它,必须要深入地去了解什么是HTML5。 网上有很多说法,说HTML5就是html的第5个版本,其实这不完全正确,HTML5已经不是单纯的一门标识语言,它是一门综合的技术,除了最基本的html、css、javascript外,还能够提供音频视频、图像动画、本地存储以及各种重要接口,为下一代互联网应用提供了全新平台。应该说有了HTML5,我们就能轻松实现类似桌面的应用(比如各种管理系统、手机app应用等) HTML5现在为什么收到很多企业的青睐,最关键的一点是跨平台,所谓的跨平台就是做出来的东西能够适应各种浏览器、各种设备、各种系统(iSO、安卓等),还能适应不同屏幕大小。对于企业来说,这样就能大大减少人
-
AI赋能一键自动检测:页面异常、控件异常、文本异常1.前言闲鱼质量团队一直致力于交付高质量的app给用户,当前随着AI技术不断发展,TensorFlow大热,也给测试手段带来了更多种可能,本文接下来给大家介绍AI在闲鱼测试的一点实践:如何应用AI技术通过图片找bug。2.模型选型不需要理解业务就能发现的bug主要有整体页面空白、部分控件显示异常和文本异常这几类。对于整体空白图片,发现它们的共同特征是比较明显:大面积空白或者中心区域报错,所以选择使用TensorFlow搭建的简单CNN模型来识别正常图片和异常图片。对于文本异常这类包含乱码的图片,则是用OCR+LSTM建立了一个简单的汉字识别模型来识别图片中的文本内容后判断是否存在乱码。训练以上模型的样本则来源于bug历史截图和mock的正向数据样本。3.模型重训练——提高模型识别准确率初始模型在训练时样本有限,但随着app不停更新迭代,图片检测样本数量的逐渐增多,会出现某些新页面被错误分类,要解决这类误报问题,亟需加入模型重训练。显然靠人肉启动模型重训练并替换旧模型成本太高,所以在前端实现了个勾选图片去重训
-
android内嵌html5页面不能播放视频 遇到一个问题就是在app里面的一个html5页面里面有个video标签,死活加载不出来,也播放不了,奇怪的是只有android端会这样,移动端正常,最后我 换成了直接跳转到指向视频的链接,这样就可以播放了,初步推测应该是android 端的webview对video支持不好造成的。所以遇到app内内嵌html5的时候要注意,他可能根本不支持vedio标签,除非直接跳转到视频的地址。
-
android内嵌html5页面不能播放视频 遇到一个问题就是在app里面的一个html5页面里面有个video标签,死活加载不出来,也播放不了,奇怪的是只有android端会这样,移动端正常,最后我 换成了直接跳转到指向视频的链接,这样就可以播放了,初步推测应该是android 端的webview对video支持不好造成的。所以遇到app内内嵌html5的时候要注意,他可能根本不支持vedio标签,除非直接跳转到视频的地址。
html5异常页面相关课程
html5异常页面相关教程
- HTML5 地理位置 地理定位功能是 HTML5 新增的标准,早期的 HTML 和 JavaScript 没有操控硬件和文件的权限,因为页面交互效果比较简单;但是 HTML5 之后网页已经逐渐应用于各种复杂场景包括移动设备,所以增加了各种与硬件交互的 API 接口,地理位置就是其中之一。
- 3.2 全局异常处理器 Spring MVC 提供了名为 SimpleMappingExceptionResolver 的异常处理组件,该组件实现了 HandlerExceptionResolver 接口,或者说实现了这个接口的对象都可称其为全局异常处理器。何谓全局异常处理器?通俗讲,有点类似于前端控制器的设计思路。Spring MVC 把所有异常分离出来后通通交给全局异常处理器做集中处理。使用流程:打开项目中的 WebConfig 配置类,添加组件;@Beanpublic SimpleMappingExceptionResolver simpleMappingExceptionResolver() { SimpleMappingExceptionResolver simResolver=new SimpleMappingExceptionResolver(); //异常处理页面 simResolver.setDefaultErrorView("error"); //封装异常信息的属性名,默认是 exception simResolver.setExceptionAttribute("exception"); //添加自定义异常信息 Properties mappings=new Properties(); mappings.put("com.mk.web.exception.MyException", "/WEB-INF/jsp/exception.jsp"); simResolver.setExceptionMappings(mappings); return simResolver;}代码中有注解,不再多言。自定义异常类。自定义异常类并不是必须的,项目中自定义异常的目的可以让异常的语义更具体;public class MyException extends Exception { public MyException() { } public MyException(String msg) { super(msg); }}编写控制器。控制器中的方法会根据 userName 的值决定是否抛出异常。 @RequestMapping("/exception03") public String exception03(String userName) throws MyException { if (StringUtils.isEmpty(userName)) { throw new MyException("用户名不能为空"); } return "index"; }测试。打开浏览器,输入 http://localhost:8888/sm-demo/exception03 ;浏览器会显示把错误导向到 “WEB-INF/exception.jsp” 页面。此页面,可添加下面的代码。 <body> 出错啦!${exception.message} </body> 解析出错误的具体信息,最后可以在浏览器中看到:开发者可以根据需要编写自己的全局异常处理器组件。
- 2. 异常处理原则 异常是程序运行过程中不可避免的问题。异常出现的原因很多,但不管怎样,都需要提前预知或者当异常发生后采取相应的处理措施。异常的处理原则是:能预知的尽可能在逻辑层面提前制止。如用户注册时,要求登录名是唯一的,可先检查数据库是否存在同名用户名后,再进行添加操作;以一种友好的方式告知使用者出错的原因;采用多层体系结构的项目中,建议异常由下逐层向上抛出,一直到达应用层面;使用日志记录功能把异常信息记录在日志文件中,便于开发者分析。如下面的控制器方法:@Controllerpublic class ExceptionAction {@RequestMapping("/exception01")public String exception01(@RequestParam("userName") String userName) { return "exception";}}在浏览器中输入:http://localhost:8888/sm-demo/exception01 ,页面中会出现错误提示。这个原因是 @RequestParam(“userName”) 注解在默认情况下,要求请求包中一定要有 userName 这个参数。显然,页面中显示出来的错误信息是不友好的。所谓的异常处理,并不能完全阻止异常的发生。而是把异常信息对外、对内做一个封装,换一个浅白的、直接的、非专业的方式告诉使用者。对于前面的异常解决方案,可以在 @RequestParam(value = “userName”,required = false) 中添加一个 required = false 的设置。这是一种最理想的异常解决方案。
- 7. 异常链 异常链是以一个异常对象为参数构造新的异常对象,新的异常对象将包含先前异常的信息。简单来说,就是将异常信息从底层传递给上层,逐层抛出,我们来看一个实例:public class ExceptionDemo5 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { public SecondCustomException() { super("第二个异常"); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { public ThirdCustomException() { super("第三个异常"); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo5$ThirdCustomException: 第三个异常 at ExceptionDemo5.f3(ExceptionDemo5.java:46) at ExceptionDemo5.main(ExceptionDemo5.java:51)运行过程:通过运行结果,我们只获取到了静态方法 f3() 所抛出的异常堆栈信息,前面代码所抛出的异常并没有被显示。我们改写上面的代码,让异常信息以链条的方式 “连接” 起来。可以通过改写自定义异常的构造方法,来获取到之前异常的信息。实例如下:/** * @author colorful@TaleLin */public class ExceptionDemo6 { /** * 第一个自定义的静态内部异常类 */ static class FirstCustomException extends Exception { // 无参构造方法 public FirstCustomException() { super("第一个异常"); } } /** * 第二个自定义的静态内部异常类 */ static class SecondCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public SecondCustomException(Throwable cause) { super("第二个异常", cause); } } /** * 第三个自定义的静态内部异常类 */ static class ThirdCustomException extends Exception { /** * 通过构造方法获取之前异常的信息 * @param cause 捕获到的异常对象 */ public ThirdCustomException(Throwable cause) { super("第三个异常", cause); } } /** * 测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类 * @throws FirstCustomException */ public static void f1() throws FirstCustomException { throw new FirstCustomException(); } /** * 测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类 * @throws SecondCustomException */ public static void f2() throws SecondCustomException { try { f1(); } catch (FirstCustomException e) { throw new SecondCustomException(e); } } /** * 测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类 * @throws ThirdCustomException */ public static void f3() throws ThirdCustomException { try { f2(); } catch (SecondCustomException e) { throw new ThirdCustomException(e); } } public static void main(String[] args) throws ThirdCustomException { // 调用静态方法f3() f3(); }}运行结果:Exception in thread "main" ExceptionDemo6$ThirdCustomException: 第三个异常 at ExceptionDemo6.f3(ExceptionDemo6.java:74) at ExceptionDemo6.main(ExceptionDemo6.java:80)Caused by: ExceptionDemo6$SecondCustomException: 第二个异常 at ExceptionDemo6.f2(ExceptionDemo6.java:62) at ExceptionDemo6.f3(ExceptionDemo6.java:72) ... 1 moreCaused by: ExceptionDemo6$FirstCustomException: 第一个异常 at ExceptionDemo6.f1(ExceptionDemo6.java:51) at ExceptionDemo6.f2(ExceptionDemo6.java:60) ... 2 more运行过程:通过运行结果,我们看到,异常发生的整个过程都打印到了屏幕上,这就是一个异常链。
- 3.6 开发前端页面 在 resource/templates 下分别新建 goods.html 和 myerror.html 页面,作为正常访问及发生异常时跳转的视图页面。实例:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>goods.html页面</title></head><body> <div>商品信息页面</div></body></html>实例:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>myerror.html页面</title></head><body> 错误码: <span th:text="${code}"></span> 错误信息: <span th:text="${message}"></span></body></html>
- 3.4 控制器抛出异常 定义控制器 GoodsController ,然后使用注解 @Controller 标注该类,类中方法的返回值即为视图文件名。在 GoodsController 类定义 4 个方法,分别用于正常访问、抛出密码错误异常、抛出验证码错误异常、抛出未自定义的异常,代码如下。实例:/** * 商品控制器 */@Controllerpublic class GoodsController { /** * 正常方法 */ @RequestMapping("/goods") public String goods() { return "goods";// 跳转到resource/templates/goods.html页面 } /** * 抛出密码错误异常的方法 */ @RequestMapping("/checkPassword") public String checkPassword() throws PasswordException { if (true) { throw new PasswordException();// 模拟抛出异常,便于测试 } return "goods"; } /** * 抛出验证码错误异常的方法 */ @RequestMapping("/checkVerification") public String checkVerification() throws VerificationCodeException { if (true) { throw new VerificationCodeException();// 模拟抛出异常,便于测试 } return "goods"; } /** * 抛出未自定义的异常 */ @RequestMapping("/other") public String other() throws Exception { int a = 1 / 0;// 模拟异常 return "goods"; }}
html5异常页面相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle