特别很是言语措置
- 法度圭表类型运转时,产生发火的特别不被期看的义务 ,它阻拦了法度圭表类型固守法度圭表类型员的措置预期正常奉行 ,这就长短常
- golang中供给了两种措置特别很是案例的编制
- 一种是法度圭表类型产生发火特别很是时, 将特别很是信息回响给独霸者
- 一种是法度圭表类型产生发火特别很是时, 当即介入延续法度圭表类型延续运转
打印特别很是信息
- Go言语中供给了两种成立特别很是信息的编制
- 编制一: 经由过程fmt包中的Errorf函数成立偏向信息, 然后打印
package mainimport "fmt"func main() { // 1.成立偏向信息 var err error = fmt.Errorf("这里是偏向信息") // 2.打印偏向信息 fmt.Println(err) // 这里是偏向信息}- 编制二: 经由过程errors包中的New函数成立偏向信息,然后打印
package mainimport "fmt"func main() { // 1.成立偏向信息 var err error = errors.New("这里是偏向信息") // 2.打印偏向信息 fmt.Println(err) // 这里是偏向信息}- 两种成立特别很是信息完成事邃晓析
- Go言语中成立特别很是信息真实都是经由过程一个error接口完成的
- Go言语再builtin包中定义了一个称号叫做error的接口. 源码以下
package builtin// 定义了一个称号叫做error的接口// 接口中声了然一个叫做Error() 的编制type error inte***ce { Error() string}- 在errors包中定义了一个称号叫做做errorString的筹划体, 独霸这个筹划体完成了error接口中指定的编制
- 并且在errors 包中还供给了一个New编制, 用于成立完成了error接口的筹划体对象, 并且在成立时就会把指定的字符勾搭报给这个筹划体
// 指定包名为errorspackage errors // 定义了一个称号叫做errorString的筹划体, 里面有一个字符串圭表类型属性stype errorString struct { s string}// 完成了error接口中的Error编制// 内部直接将筹划体中保管的字符串前去func (e *errorString) Error() string { return e.s}// 定义了一个New函数, 用于成立特别很是信息// 寄看: New函数的前去值是一个接口圭表类型func New(text string) error { // 前去一个成立好的errorString筹划体地址 return &errorString{ text}}- fmt包中Errorf底层的完成事理真实就是在内部主动调用了errors包中的New函数
func Errorf(format string, a ...inte***ce{ }) error { return errors.New(Sprintf(format, a...))}- 独霸处景
package mainimport "fmt"func div(a, b int) (res int, err error) { if(b == 0){ // 一旦传进的除数为0, 就会前去error信息 err = errors.New("除数不克不及为0") }else{ res = a / b } return}func main() { //res, err := div(10, 5) res, err := div(10, 0) if(err != nil){ fmt.Println(err) // 除数不克不及为0 }else{ fmt.Println(res) // 2 }}中缀法度圭表类型
- Go言语中供给了一个叫做panic函数, 用于产生发火特别很是时辰断法度圭表类型延续运转
package mainimport "fmt"func div(a, b int) (res int) { if(b == 0){ //一旦传进的除数为0, 法度圭表类型就会延续 panic("除数不克不及为0") }else{ res = a / b } return}func main() { res := div(10, 0) fmt.Println(res)}- Go言语中有两种编制可以触发panic延续法度圭表类型
- 我们本身手动调用panic函数
- 法度圭表类型内部展示问题主动触发panic函数
package mainimport "fmt"func main() { // 比如:数组角标越界, 就会主动触发panic var arr = [3]int{ 1, 3, 5} arr[5] = 666 // 报错 fmt.Println(arr) // 比如:除数为0, 就会主动触发panic var res = 10 / 0 fmt.Println(res)}- 除非是不成恢复性 、招致琐细没法正常工作的分析偏向, 不然不建议独霸panic
恢复法度圭表类型
- 法度圭表类型和人一样都需求具有必定的容错身手, 学会知错就改. 所以假定不是不成恢复性 、招致琐细没法正常工作的言语偏向, 假定产生发火了panic我们需求恢复法度圭表类型, 让法度圭表类型延续奉行,并且需求记实幻想下场犯了甚么偏向
- 在Go言语中我们可以经由过程defer和recover来完成panic特别很是的捕获, 让法度圭表类型延续奉行
package mainimport "fmt"func div(a, b int) (res int) { // 定义一个迟误调用的函数, 用于捕获panic特别很是 // 寄看: 必定要在panic之前定义 defer func() { if err := recover(); err != nil{ res = -1 fmt.Println(err) // 除数不克不及为0 } }() if(b == 0){ //err = errors.New("除数不克不及为0") panic("除数不克不及为0") }else{ res = a / b } return}func setValue(arr []int, index int ,value int) { arr[index] = value}func main() { res := div(10, 0) fmt.Println(res) // -1}- panic寄看点
- panic特别很是会沿着调用仓库向别传递, 所以也可以在外层捕获
package mainimport "fmt"func div(a, b int) (res int) { if(b == 0){ //err = errors.New("除数不克不及为0") panic("除数不克不及为0") }else{ res = a / b } return}func main() { // panic特别很是会沿着调用仓库向别传递, 所以也可以在外层捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 除数不克不及为0 } }() div(10, 0)}- 多个特别很是,只需第一个会被捕获
package mainimport "fmt"func test1() { // 多个特别很是,只需第一个会被捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 特别很是A } }() panic("特别很是A") // 相当于return, 后背代码不会延续奉行 panic("特别很是B")}func main() { test1(10, 0)}- 假如有特别很是写在defer中, 那么只需defer中的特别很是会被捕获
package mainimport "fmt"func test2() { // 假如有特别很是写在defer中, 并且此外特别很是写在defer后背, 那么只需defer中的特别很是会被捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 特别很是A } }() defer func() { panic("特别很是B") }() panic("特别很是A")}func main() { test1(10, 0)}到此这篇关
特别很是措置
- 法度圭表类型运转时 ,产生发火的特别不被期看的义务 ,它阻拦了法度圭表类型固守法度圭表类型员的措置预期正常奉行 ,这就长短常
- golang中供给了两种措置特别很是案例的编制
- 一种是法度圭表类型产生发火特别很是时, 将特别很是信息回响给独霸者
- 一种是法度圭表类型产生发火特别很是时, 当即介入延续法度圭表类型延续运转
打印特别很是信息
- Go言语中供给了两种成立特别很是信息的编制
- 编制一: 经由过程fmt包中的Errorf函数成立偏向信息, 然后打印
package mainimport "fmt"func main() { // 1.成立偏向信息 var err error = fmt.Errorf("这里是偏向信息") // 2.打印偏向信息 fmt.Println(err) // 这里是偏向信息}- 编制二: 经由过程errors包中的New函数成立偏向信息,然后打印
package mainimport "fmt"func main() { // 1.成立偏向信息 var err error = errors.New("这里是偏向信息") // 2.打印偏向信息 fmt.Println(err) // 这里是偏向信息}- 两种成立特别很是信息完成事邃晓析
- Go言语中成立特别很是信息真实都是经由过程一个error接口完成的
- Go言语再builtin包中定义了一个称号叫做error的接口. 源码以下
package builtin// 定义了一个称号叫做error的接口// 接口中声了然一个叫做Error() 的编制type error inte***ce { Error() string}- 在errors包中定义了一个称号叫做做errorString的筹划体, 独霸这个筹划体完成了error接口中指定的编制
- 并且在errors 包中还供给了一个New编制, 用于成立完成了error接口的筹划体对象, 并且在成立时就会把指定的字符勾搭报给这个筹划体
// 指定包名为errorspackage errors // 定义了一个称号叫做errorString的筹划体, 里面有一个字符串圭表类型属性stype errorString struct { s string}// 完成了error接口中的Error编制// 内部直接将筹划体中保管的字符串前去func (e *errorString) Error() string { return e.s}// 定义了一个New函数, 用于成立特别很是信息// 寄看: New函数的前去值是一个接口圭表类型func New(text string) error { // 前去一个成立好的errorString筹划体地址 return &errorString{ text}}- fmt包中Errorf底层的完成事理真实就是在内部主动调用了errors包中的New函数
func Errorf(format string, a ...inte***ce{ }) error { return errors.New(Sprintf(format, a...))}- 独霸处景
package mainimport "fmt"func div(a, b int) (res int, err error) { if(b == 0){ // 一旦传进的除数为0, 就会前去error信息 err = errors.New("除数不克不及为0") }else{ res = a / b } return}func main() { //res, err := div(10, 5) res, err := div(10, 0) if(err != nil){ fmt.Println(err) // 除数不克不及为0 }else{ fmt.Println(res) // 2 }}中缀法度圭表类型
- Go言语中供给了一个叫做panic函数, 用于产生发火特别很是时辰断法度圭表类型延续运转
package mainimport "fmt"func div(a, b int) (res int) { if(b == 0){ //一旦传进的除数为0, 法度圭表类型就会延续 panic("除数不克不及为0") }else{ res = a / b } return}func main() { res := div(10, 0) fmt.Println(res)}- Go言语中有两种编制可以触发panic延续法度圭表类型
- 我们本身手动调用panic函数
- 法度圭表类型内部展示问题主动触发panic函数
package mainimport "fmt"func main() { // 比如:数组角标越界, 就会主动触发panic var arr = [3]int{ 1, 3, 5} arr[5] = 666 // 报错 fmt.Println(arr) // 比如:除数为0, 就会主动触发panic var res = 10 / 0 fmt.Println(res)}- 除非是不成恢复性 、招致琐细没法正常工作的分析偏向, 不然不建议独霸panic
恢复法度圭表类型
- 法度圭表类型和人一样都需求具有必定的容错身手, 学会知错就改. 所以假定不是不成恢复性、招致琐细没法正常工作的言语偏向, 假定产生发火了panic我们需求恢复法度圭表类型, 让法度圭表类型延续奉行,并且需求记实幻想下场犯了甚么偏向
- 在Go言语中我们可以经由过程defer和recover来完成panic特别很是的捕获, 让法度圭表类型延续奉行
package mainimport "fmt"func div(a, b int) (res int) { // 定义一个迟误调用的函数, 用于捕获panic特别很是 // 寄看: 必定要在panic之前定义 defer func() { if err := recover(); err != nil{ res = -1 fmt.Println(err) // 除数不克不及为0 } }() if(b == 0){ //err = errors.New("除数不克不及为0") panic("除数不克不及为0") }else{ res = a / b } return}func setValue(arr []int, index int ,value int) { arr[index] = value}func main() { res := div(10, 0) fmt.Println(res) // -1}- panic寄看点
- panic特别很是会沿着调用仓库向别传递, 所以也可以在外层捕获
package mainimport "fmt"func div(a, b int) (res int) { if(b == 0){ //err = errors.New("除数不克不及为0") panic("除数不克不及为0") }else{ res = a / b } return}func main() { // panic特别很是会沿着调用仓库向别传递, 所以也可以在外层捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 除数不克不及为0 } }() div(10, 0)}- 多个特别很是,只需第一个会被捕获
package mainimport "fmt"func test1() { // 多个特别很是,只需第一个会被捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 特别很是A } }() panic("特别很是A") // 相当于return, 后背代码不会延续奉行 panic("特别很是B")}func main() { test1(10, 0)}- 假如有特别很是写在defer中, 那么只需defer中的特别很是会被捕获
package mainimport "fmt"func test2() { // 假如有特别很是写在defer中, 并且此外特别很是写在defer后背, 那么只需defer中的特别很是会被捕获 defer func() { if err := recover(); err != nil{ fmt.Println(err) // 特别很是A } }() defer func() { panic("特别很是B") }() panic("特别很是A")}func main() { test1(10, 0)}到此这篇关Go言语

