TIJ——Chapter Twelve:Error Handling with Exception
Exception guidelines
Use exceptions to:
- Handle problems at the appropriate level.(Avoid catching exceptions unless you know what to do with them.)
- Fix the problem and call the method that caused the exception again.
- Patch things up and continue without retrying the method.
- Calculate some alternative result instead of what the method was supposed to produce.
- Do whatever you can in the current context and rethrow the same exception to a higher context.
- Do whatever you can in the current context and throw a different exception to a higher context.
- Terminate the program.
- Simplify.(If your exception scheme make things more complicated, then it is painful and annoying to use.)
- Make your library and program safer.(This is a short-term investment of debugging, and a long-term investment for application robustness.)
- If you're inside a method and you throw an exception(or another method that you call within this method throws an exception), that method will exit in the process of throwing. If you don't want a throws to exit the method, you can set up a special block within that method to capture the exception. This is called the try block because you "try" your various method calls there.
- Exercise: Create your own resumption-like behavior using a while loop that repeats until an exception is no longer thrown.
class ResumerException extends Exception {}
class Resumer
{
static int count = 3;
static void f() throws ResumerException
{
if(--count > 0)
throw new ResumerException();
}
}
public class Test
{
public static void main(String[] args)
{
while(true)
{
try
{
Resumer.f();
}
catch(ResumerException e)
{
System.out.println("Caught " + e);
continue;
}
System.out.println("Got through...");
break;
}
System.out.println("Successful execution");
}
}
/* Output:
Caught com.tij.ibook.ResumerException
Caught com.tij.ibook.ResumerException
Got through...
Successful execution
*/
由上面的代码,可以给我们启示:我们甚至可以指定出现异常的代码最多执行的次数。比如,有一个可能会由于我们的网络不稳定等原因导致的网络连接超时异常,这时我们可以尝试再次连接。通过这种方式,我们可以构建更加健壮的程序。
- The Java class Throwable describes anything that can be thrown as an exception. There are two general type of Throwable objects("types of"="inherited from"). Error represents compile-time and system errors that you don't worry about catching(except in very special cases). Exception is the basic type that can be thrown from any of the standard Java library class methods and from your methods and runtime accidents. So the Java programmer's base type of interest is usually Exception.
- There's whole group of exception types that are in this category. They're always thrown automatically by Java and you don't need to include them in your exception specifications, Conveniently enough, they're all grouped together by putting them under a single base class called RuntimeException, which is a perfect example of inheritance: It establishes a family of types that have some characteristics and behaviors in common. Also, you never need to write an exception specification saying that a method might throw a RuntimeException(or any type inherited from RuntimeException), because they are unchecked exceptions.
- If a RuntimeException gets all the way out to main() without being caught, printStackTrace() is called for that exception as the program exits.
- Keep in mind that only exceptions of type RuntimeException(and subclass) can be ignored in your coding, since the compiler carefully enforces the handling of all checked exceptions. The reasoning is that a RuntimeException represents a programming error, which is:
- (#1) An error you cannot anticipate. For example, a null reference that is outside of your control.
- (#2) An error that tyou, as a programmer, should have checked for in your code(such as ArrayIndexOutOfBoundsException where you should have paid attention to the size of array). An exception that happens from point #1 often becomes an issue for point #2.
- You can see what a tremendous benifit it is to have exception in Java, since they help in the debugging process.
- In a language without garbage collection and without automatic destructor calls, finally is important because it allows the programmer to guarantee the release of memory regardless of what happens in the try block. But Java has garbage collection, so releasing memory is virtually never a problem. Also, it has no destructors to call. So when do you need to use finally in Java? The finally clause is necessary when you need to set something other than memory back to its original state. Such as some kind of cleanup like an open file or network connection, something you've drawn on the screen, or even a swith in the outside world.
- The finally statement will also be executed in situations in which break, continue and return statements are involved.
- When you override a method, you can throw only the exceptions that hava been specified in the base-class will automatically work with any object derived from the base class(a fundamental OOP concept, of course), including exceptions. By forcing the derived-class methods to conform to the exception specifications of the base-class methods, substitutability of objects is maintained. The restiction on exception does not apply to constructors. A constructor can throw anything it wants, regardless of what the base-class constructor throws. However, since a base-class constructor must always be called one way or another, the derived-class constructor must declare any base-class constructor exceptions in its exception specification. All these constraints produce much more robust exceptionhandling code.
- 通过多个catch 块来捕获异常时,需要把父类型的catch 块放到子类型的catch 块之后,否则编译器会因子类型的catch 无法到达而报错。
- The exception specification, to programmatically state in the method signature the exceptions that could result from calling that method. The exception specification really has two purposes. It can say, "I'm originating this exception in my code; you handle it." But it can also mean, "I'm ignoring this exception that can occur as a result of my code; you handle it." We've been focusing on the "you handle it" part when looking at the machanics and syntax of exceptions, but here I'm particularly interested in the fact that we often ignore exception and that's what the exception specification can state.
A good programming language is one that helps programmers write good programs. No programming language will prevent its users from writing bad programs.
TIJ——Chapter Twelve:Error Handling with Exception的更多相关文章
- Error Handling and Exception
The default error handling in PHP is very simple.An error message with filename, line number and a m ...
- Clean Code–Chapter 7 Error Handling
Error handling is important, but if it obscures logic, it's wrong. Use Exceptions Rather Than Return ...
- setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto
目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...
- Error Handling
Use Exceptions Rather Than Return Codes Back in the distant past there were many languages that didn ...
- beam 的异常处理 Error Handling Elements in Apache Beam Pipelines
Error Handling Elements in Apache Beam Pipelines Vallery LanceyFollow Mar 15 I have noticed a defici ...
- Fortify漏洞之Portability Flaw: File Separator 和 Poor Error Handling: Return Inside Finally
继续对Fortify的漏洞进行总结,本篇主要针对 Portability Flaw: File Separator 和 Poor Error Handling: Return Inside Fina ...
- Error handling in Swift does not involve stack unwinding. What does it mean?
Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia su ...
- WCF Error Handling
https://docs.microsoft.com/en-us/dotnet/framework/wcf/wcf-error-handling The errors encountered by a ...
- ASP.NET Error Handling
https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspn ...
随机推荐
- Leetcode216. Combination Sum III组合总数3
找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入: k = ...
- Redis源码解析:16Resis主从复制之主节点的完全重同步流程
主从复制过程中,主节点根据从节点发来的命令执行相应的操作.结合上一章中讲解的从节点在主从复制中的流程,本章以及下一篇文章讲解一下主节点在主从复制过程中的流程. 本章主要介绍完全重同步流程. 一:从节点 ...
- Django项目:CRM(客户关系管理系统)--20--12PerfectCRM实现King_admin分页上下页
{#table_data_list.html#} {## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#} {% extends 'king_m ...
- bzoj 1053 [HAOI2007]反素数ant——关于质数的dfs / 打表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 写了个打表程序. #include<iostream> #include& ...
- 前端(jQuery)(9)-- jQuery菜单
1.垂直菜单布局 2.垂直菜单实现 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 在vscode中使用字体Cascadia Code
下载字体 下载地址:github:https://github.com/microsoft/cascadia-code/releases 安装字体(windows10) 设置 > 个性化 > ...
- 第一篇:前端知识之HTML内容
HTTP协议介绍 什么是HTTP协议 超文本传输协议,规定了浏览器与服务端之间数据传输的格式. HTTP协议的四大特性 基于请求响应 一次请求对应一次响应 基于TCP/IP作用于应用层之上的协议 无状 ...
- proteus 8.8 直装版提示Symbol $MKRORIGIN used but not found in libraries 安装后没有库
用管理员运行程序,然后再通过菜单打开仿真文件是没问题. 解决方法:通常的安装目录是C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Prof ...
- description The request sent by the client was syntactically incorrect.
shi用url传递参数,其他页面都ojbk的 唯独有一个请求 不应该啊 这明显的已经配置好了啊 因为别的请求我也是这样配置的啊,运行是没问题的啊 运行好好的啊 一时间,感觉无从下手了 经过十几分钟各种 ...
- springmvc 使用poi解析excel并通过hibernate连续插入多条数据 实际数据库只能保存最后一条
有一个原始数据的excel表 用poi解析之后通过hibernate插数据库 结果 后来发现,有人说 果断尝试 问题解决 但是这好像并不是真正解决问题,只是解决了一个现象 因为有人说 https:// ...