异常处理

Java异常

大兔子大兔子 提交于 2019-12-10 19:41:17
异常 异常的概念 什么是异常 概念 : 程序在运行过程中出现的特殊情况。 异常处理的必要性 : 任何程序都可能存在大量的位置问题、错误;如果不对这些问题进行正常处理,则可能导致程序的中断,造成不必要的损失。 异常处理 :Java编程语言使用异常处理机制为程序提供了异常处理的能力。 异常的分类 Throwable :可抛出的,一切错误或异常的父类,位于java.lang包中。 Error :JVM、硬件、执行逻辑错误,不能手动处理。 StackOverflowError :栈溢出错误 OutOfMemoryError :内存不足错误 Exception :程序在运行和配置中产生的问题,可处理。 RuntimeException :运行时异常,可处理,可不处理。 CheckedException :检查时异常,必须处理。 常见运行时异常 类型 说明 NullPointerException 空指针异常 ArrayIndexOutOfBoundsException 数组越界异常 ClassCastException 类型转换异常 NumberFormatException 数字格式化异常 ArithmeticException 算术异常 异常的产生 当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出。 异常的传递 按照方法的调用链反向传递

SpringBoot 全局异常处理 @RestControllerAdvice +@ExceptionHandler 请求参数校验

≡放荡痞女 提交于 2019-12-10 15:19:42
ControllerAdvice 指示带注释的类辅助“控制器”。 作为的特殊化 @Component ,允许通过类路径扫描自动检测实现类。 通常用于定义 @ExceptionHandler , @InitBinder 和 @ModelAttribute 适用于所有 @RequestMapping 方法的方法。 之一的 annotations() , basePackageClasses() , basePackages() 或它的别名 value() 可以被指定,以限定控制器,以协助的特定子集。 当应用多个选择器时,将应用“或”逻辑-表示选定的控制器应至少匹配一个选择器。 默认行为(即,如果不使用任何选择器使用),带 @ControllerAdvice 注释的类将帮助所有已知的Controller。 请注意,这些检查是在运行时完成的,因此添加许多属性并使用多种策略可能会带来负面影响(复杂性,性能)。 /** * SpringMVC统一异常处理 * 注:@ControllerAdvice为Controller层增强器,其只能处理Controller层抛出的异常; * 由于代码间的层级调用机制 、异常的处理机制等,所以这里处理Controller层的异常,就相当于 * 处理了全局异常 * @author */@RestControllerAdvicepublic class

python异常处理代码执行说明

坚强是说给别人听的谎言 提交于 2019-12-10 11:31:44
python异常处理代码执行说明 #!/usr/bin/python # -*- coding: UTF-8 -*- #This is note foe exception try: code #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序 except: #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息 #except ExceptionName,args: #同时也可以接受异常名称和参数,针对不同形式的异常做处理 code #这里执行异常处理的相关代码,打印输出等 else: #如果没有异常则执行else code #try部分被正常执行后执行的代码 finally: code #退出try语句块总会执行的程序 #函数中做异常检测 def try_exception(num): try: return int(num) except ValueError,arg: print arg,"is not a number" else: print "this is a number inputs" try_exception('xxx') #输出异常值 Invalide literal for int() with base 10: 'xxx' is not a number 注意事项 不要在 try 里写返回值。 try-except

FutureTask的get()方法之异常处理

China☆狼群 提交于 2019-12-10 10:23:33
项目中遇到线程池异步处理Callable请求,阻塞接收future.get()结果时,对线程中断状态位state的处理问题。try {   Future<Object> future = executor.submit(callcable);   future.get(); } catch (InterruptedException e) {   Thread.interrupted(); // 重置当前线程的中断位state为true,便于该线程以后被其他任务正常调用 } 对项目中的这种处理感到疑惑,翻了下源码中具体的实现细节,发现Future的实现类FutureTask的get()方法如下: public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); // throws InterruptedException return report(s); // throws ExecutionException }其中InterruptedException是awaitDone(false, 0L)方法抛出的: if (Thread.interrupted()) { removeWaiter(q

java那些事(八)之深入理解java异常处理机制

冷暖自知 提交于 2019-12-10 09:54:10
1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训” 告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案 哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 <span style= "background-color: rgb(255, 255, 255);" > package Test; public class TestException { public TestException() { } boolean testEx() throws Exception { boolean ret = true ; try { ret = testEx1(); } catch (Exception e) { System.out.println( "testEx, catch exception" ); ret = false ; throw e; } finally { System.out.println( "testEx, finally; return value=" + ret); return ret; } } boolean testEx1() throws

Spring Cloud微服务如何设计异常处理机制?

浪子不回头ぞ 提交于 2019-12-10 04:38:45
在采用Spring Cloud进行微服务架构设计时,微服务之间调用时异常处理机制应该如何设计的问题。我们知道在进行微服务架构设计时,一个微服务一般来说不可避免地会同时面向内部和外部提供相应的功能服务接口。面向外部提供的服务接口,会通过服务网关(如使用Zuul提供的apiGateway)面向公网提供服务,如给App客户端提供的用户登陆、注册等服务接口。 而面向内部的服务接口,则是在进行微服务拆分后由于各个微服务系统的边界划定问题所导致的功能逻辑分散,而需要微服务之间彼此提供内部调用接口,从而实现一个完整的功能逻辑,它是之前单体应用中本地代码接口调用的服务化升级拆分。例如,需要在团购系统中,从下单到完成一次支付,需要交易系统在调用订单系统完成下单后再调用支付系统,从而完成一次团购下单流程,这个时候由于交易系统、订单系统及支付系统是三个不同的微服务,所以为了完成这次用户订单,需要App调用交易系统提供的外部下单接口后,由交易系统以内部服务调用的方式再调用订单系统和支付系统,以完成整个交易流程。如下图所示: 这里需要说明的是,在基于SpringCloud的微服务架构中,所有服务都是通过如consul或eureka这样的服务中间件来实现的服务注册与发现后来进行服务调用的,只是面向外部的服务接口会通过网关服务进行暴露,面向内部的服务接口则在服务网关进行屏蔽,避免直接暴露给公网

java基础之异常 · fossi

冷暖自知 提交于 2019-12-10 01:10:26
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念、用法等不再赘述了,直接结合面试问题来加深对异常的理解吧。 Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: Error 和 Exception 。 1. 什么是Java异常 异常是发生在进程执行过程中阻碍进程正常执行的错误事件。比如:用户输入错误数据、硬件故障、网络阻塞等都会导致出现异常。 只要在Java语句执行中产生了异常, 一个异常对象就会被创建 ,JRE就会试图寻找异常处理进程来处理异常。如果有合适的异常处理进程,异常对象就会被异常处理进程接管,否则,将引发运行环境异常,JRE终止进程执行。 Java异常处理框架只能处理运行时错误,编译错误不在其考虑范围之内。 2. Error和Exception的区别 Error:是进程无法处理的错误,表示运行应用进程中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM出现的问题。 例如,Java虚拟机运行错误,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError 。这些异常发生时,Java虚拟机一般会选择线程终止。 3. Java异常处理中有哪些关键字? throw :有时我们需要显式地创建并抛出异常对象来终止进程的正常执行。 throw

C++中的异常处理(下)

倾然丶 夕夏残阳落幕 提交于 2019-12-09 23:31:37
array.h #ifndef _ARRAY_H_ #define _ARRAY_H_ #include <stdexcept> using namespace std; template < typename T, int N > class Array { T m_array[N]; public: int length() const; bool set(int index, T value); bool get(int index, T& value); T& operator[] (int index); T operator[] (int index) const; virtual ~Array(); }; template < typename T, int N > int Array<T, N>::length() const { return N; } template < typename T, int N > bool Array<T, N>::set(int index, T value) { bool ret = (0 <= index) && (index < N); if( ret ) { m_array[index] = value; } return ret; } template < typename T, int N > bool Array

C++中的异常处理(中)

我的梦境 提交于 2019-12-09 22:43:14
为什么要在catch中重新抛出异常? #include <iostream> #include <string> using namespace std; void Demo() { try { try { throw 'c'; } catch(int i) { cout << "Inner: catch(int i)" << endl; throw i; } catch(...) { cout << "Inner: catch(...)" << endl; throw; } } catch(...) { cout << "Outer: catch(...)" << endl; } } /* 假设: 当前的函数是第三方库中的函数,因此,我们无法修改源代码 函数名: void func(int i) 抛出异常的类型: int -1 ==》 参数异常 -2 ==》 运行异常 -3 ==》 超时异常 */ void func(int i) { if( i < 0 ) { throw -1; } if( i > 100 ) { throw -2; } if( i == 11 ) { throw -3; } cout << "Run func..." << endl; } void MyFunc(int i) { try { func(i); } catch(int i) { switch

C++中的异常处理(上)

荒凉一梦 提交于 2019-12-09 22:08:15
C++内置了异常处理的语法元素try... catch ... -t ry语句处理正常代码逻辑 - catch语句处理异常情况 -try语句中的异常由对应的catch语句处理 try {   double r = divide(1,0); } catch(...) {   cout << "Divided by zero..." << endl; } C++通过throw语句抛出异常信息 double divide(double a, double b) { const double delta = 0.000000000000001; double ret = 0; if( !((-delta < b) && (b < delta)) ) { ret = a / b; } else { throw 0; //产生除0异常 } return ret; } C++异常处理分析 -throw抛出的异常 必须被catch处理    当前函数能够处理异常,程序继续往下执行    当前函数无法处理异常,则函数停止执行,并返回 未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行 当产生异常后,先看function3这个函数有没有能力处理,此时是没有能力处理的。于是function3这个函数就会立即停止执行,并且带着 异常返回function2的调用点