火影忍者手游时辰一笔划48关攻略

焦点 716℃

特别很是言语措置

  • 法度圭表类型运转时 ,产生发火的特别不被期看的义务,它阻拦了法度圭表类型固守法度圭表类型员的措置预期正常奉行  ,这就长短常
  • 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言语