基础知识《十》unchecked异常和checked异常
运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理。也称为unchecked异常。
Checked异常在编译时就能确定,Checked异常需要自己处理。
checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常.
runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
对于运行时异常,程序员不进行处理,则运行时直接报错;如果程序员进行try/catch/finally的处理,则异常会被捕捉。
比如:以下将返回3
public int count() {
try{
return /;
} catch(Exception e){
return *;
} finally {
return ;
}
}
基础知识
程序开发中,数据流按照一定的规律进行传输,如果用户和程序之间的交互完全按照预定的效果运行,程序不会出现问题。可以假设所处理的数据都符合要求,通过界面作格式判定,所有资源都正确,但是为了系统的安全,需要处理存在的隐患,不能对数据安全抱有理想化的想法。
在ASP.NET中,错误处理分为两个层面:页面输入信息验证、CLR提供的结构化错误处理机制。
在页面输入信息判断中,可以采用JavaScript、VBScript等脚本进行判断,也可以使用.NET 环境下带有的Validation和正则表达式的方式将信息在提交执行处理前,进行格式判断。格式判断包括:网络地址、电子信箱、输入字符串长短和输入信息的数据类型的判断等。
结构化异常处理是CLR的基础部分,具有以下特点:可以跨语言,异常可以在一种语言中引发,在另外一种语言中捕捉处理;分层处理,一个异常可以包括另外一个异常,这意味着系统可以捕获底层对象(如数据层和业务层)的异常,引发自己的异常,包含有底层对象的异常。这样可以将异常进行细致分类,使得异常更容易处理。
结构化异常处理,一般要使用3部分代码。
(1)Try:是程序中可能出现错误的操作部分。
(2)Catch:是用来处理各种错误的部分(可以有多个)。必须正确排列捕获异常的Catch子句,范围小的Exception放在前面的Catch。即如果Exception之间存在继承关系,就应把子类的Exception放在前面的Catch子句中。
(3)Finally 块的代码用来清理资源或执行要在Try块末尾执行的其他操作(可以省略)。无论是否产生异常,Finally块都会执行。
结构化异常处理
异常是在程序设计中无法避免的错误,设计的程序必须能够处理所有可能出现的错误。所以要全面考虑异常处理,将一切可能出现异常的代码都进行try的捕捉,然后建立自己的异常处理机制,按照不同的异常情况进行分类处理。
异常产生的时候,需要知道是什么原因造成的错误以及错误的相关信息。根据实际情况抛出具体类型的异常,然后建立捕捉机制,捕捉到异常时做出具体的处理。在编写代码过程中,可以使用系统已定义的相关异常类以及自定义的异常类来实例化并抛出需要的异常。如一个不可能实现的接口,可以抛出System.NotSupportedExceptiion的异常来告诉接口的调用者。
在处理异常的时候,应该将可处理的具体异常分别在catch 块中作出相应处理,否则程序将终止运行。针对每一种异常,以不同方式处理,避免对所有异常做出一样的处理。并且在异常产生时,给用户一个友好的提示(最终用户对系统异常的具体内容是不明白的,这就需要给出相关的信息提示和解决方案,或告诉联系管理员等),并在可能的情况下给用户提供选择(确定和取消),让用户来决定系统的运行方向。同时,程序中要将异常做日志记录。不是所有异常都是必须记录的,例如一些可捕捉并且已经安排程序进行处理的异常就不需要记录它。
可以采取如下形式记录异常:
在文件中记录异常。便于技术人员查看所发生的异常,从而日后对程序进行改进。
在数据库中记录异常。数据库支持查询,这样在后期就能够对异常进行分类查询等操作,便于查看与管理。
在Eventlog中记录异常。能够远程操作,方便系统管理员监控所有计算机的异常。
除了可预料到的异常外,还有未预料到的异常。这类异常是无法进行管理的,发生后将系统程序转移到特定的错误页面,提示用户系统出错,结束程序。做好日志能为解决和调试问题带来很多方便。要避免使用了Try-Catch但没有处理异常的情况,否则就相当于给异常放行(这种情况还不如根本不去捕获)。
异常处理,还应该注意在Finally块中释放相关资源、还原相关设置信息等收尾工作。基本程序结构如下:
try
{
int x = 123/0; //会抛出一个除数为0的异常
}
catch
{
// ... //在这里捕捉到这个异常,然后进行相关处理
}
finally
{
// ... //在这里做最后的清理或是其他工作
}
本章的异常处理是针对容易出现错误的地方(操作数据库)应用此技术,但是只是捕捉到SQL异常后,给用户一个错误提示,并没有进一步作程序的处理。
C#中常见异常类
Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。
ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常。
基础知识《十》unchecked异常和checked异常的更多相关文章
- Java基础知识强化99:Java 常见异常及趣味解释
常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎:) 1. java.langjava.lang软件包是java语言的核心部分,它提供了java中的基础类. java.lan ...
- Android学习之基础知识十二 — 第二讲:网络编程的最佳实践
上一讲已经掌握了HttpURLConnection和OkHttp的用法,知道如何发起HTTP请求,以及解析服务器返回的数据,但是也许你还没发现,之前我们的写法其实是很有问题的,因为一个应用程序很可能会 ...
- Java基础知识强化24:Java中异常
1.什么是异常 ? Java程序运行中,常常会遇到非正常的现象,这种情况称为运行错误.根据性质可以分为错误和异常.Java程序中(无论谁写的代码),所有抛出(throw)的异常都必须从Th ...
- Android学习之基础知识十—内容提供器(Content Provider)
一.跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能 ...
- java 基础知识十 继承和多态
java 基础知识十 继承和多态 继承 1.定义: 继承是指声明一些类,可以再进一步声明这些类的子类,而子类具有父类已经拥有的一些方法和属性,这跟现实中的父子关系是十分相似的,所以面向对象把这种 ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
- ASP.NET Core 2.2 基础知识(十六) SignalR 概述
我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...
- 对象数组、集合、链表(java基础知识十五)
1.对象数组的概述和使用 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student[5]; //存储学生 ...
随机推荐
- StringIO和BytesIO
1. StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. StringIO顾名思义就是在内存中读写str. 要把str写入StringIO,我们需要先创建一个StringIO,然后 ...
- vs2013给类添加默认注释
目录:D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\20 ...
- ActiveMQ入门实例Demo
前面我们已经搭建和配置好了ActiveMQ,下面来看一个Demo,体验一下MQ. JMS 消息模型 JMS消息服务应用程序结构支持两种模型:点对点模型,发布者/订阅者模型. (1)点对点模型(Queu ...
- 基于bootstrap样式的tree,
<!doctype html><html lang="zh"><head> <meta charset="UTF-8" ...
- Redis设计与实现读书笔记(一) SDS
作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少 ...
- Jmeter学习笔记TWO
使用非GUI模式运行Jmeter脚本并自动生成测试报告 命令:jmeter -n -t tougu.jmx -l result.jtl -e -o /tmp/ResultReport 这个命令是用于执 ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- Android笔记
SYSTEM_ALERT_WINDOW and WRITE_SETTINGS, 这两个权限比较特殊,不能通过代码申请方式获取,必须得用户打开软件设置页手动打开,才能授权.路径是:Settings-&g ...
- hibernate缓存机制(转)
原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...
- Android源码——Activity组件的启动过程
根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...