在编程中,有时我们的程序无法正常运行并会产生错误。例如:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
result := 20 / i
fmt.Println(result)
}
}
当我们运行这段代码时,我们会收到一个名为整数除以零的错误。
在第一次迭代中,i 的值为0,因此代码 result := 20 / i
尝试将一个数除以0。
在这种状态下,程序停止执行,这称为 Go 错误。这里,“整数除以零”是编译器返回的错误消息。
注意:我们在上一个示例中遇到的错误是一个内置错误。在 Go 中,我们也可以创建自己的错误以实现高效编程。
Golang 错误处理
当发生错误时,程序的执行会因内置错误消息而完全停止。在 Go 中,我们. 因此,在程序中处理这些异常非常重要。
与其他编程语言不同,Go 中不使用try/catch 来处理错误。我们可以使用以下方法处理错误:
New()
函数Errof()
函数
1. 使用 New() 函数的 Go 错误
在 Go 中,我们可以使用 New()
函数来处理错误。此函数定义在 errors
包中,并允许我们创建自己的错误消息。
让我们看一个例子,
package main
// import the errors package
import (
"errors"
"fmt"
)
func main() {
message := "Hello"
// create error using New() function
myError := errors.New("WRONG MESSAGE")
if message != "Programiz" {
fmt.Println(myError)
}
}
输出
WRONG MESSAGE
在上面的示例中,我们使用 errors.New()
函数创建了一个错误。
myError := errors.New("WRONG MESSAGE")
这里,New()
函数中的“WRONG MESSAGE”是自定义错误消息。当 message 变量与给定的字符串“PROGRAMIZ”不匹配时,它会打印出来。
示例:使用 New() 的错误
package main
// import the errors package
import (
"errors"
"fmt"
)
// function that checks if name is Programiz
func checkName(name string) error {
// create a new error
newError := errors.New("Invalid Name")
// return the error if name is not Programiz
if name != "Programiz" {
return newError
}
// return nil if there is no error
return nil
}
func main() {
name := "Hello"
// call the function
err := checkName(name)
// check if the err is nil or not
if err != nil {
fmt.Println(err)
} else {
fmt.Println("Valid Name")
}
}
输出
Invalid Name
在上面的示例中,我们创建了一个名为 checkName()
的函数。
checkName(name string) error {...}
此函数的返回值为 error
,这意味着此函数将返回一个错误类型的值。
在函数内部,我们使用 New()
函数创建了一个错误。这里,如果 name 不是Programiz,我们将返回新创建的错误消息。
但是,如果名字是Programiz,我们将返回 nil
(表示没有错误)。
在 main()
函数中,我们使用以下方式调用了 checkName()
函数:
err := checkName(name)
这里,返回的错误将赋给 err
。然后我们检查 err
中的值是否为 nil。
2. Golang 中使用 Errorf() 的错误
我们还可以使用 Errorf()
函数来处理 Go 错误。与 New()
不同,我们可以使用 Errorf()
来格式化错误消息。
此函数存在于 fmt
包中,因此如果我们导入了 fmt
包,则可以直接使用它。
让我们看一个例子。
package main
import "fmt"
func main() {
age := -14
// create an error using Efforf()
error := fmt.Errorf("%d is negative\nAge can't be negative", age)
if age < 0 {
fmt.Println(error)
} else {
fmt.Println("Age: %d", age);
}
}
输出
-14 is negative Age can't be negative
在上面的示例中,我们使用 Errorf()
函数创建了一个新的格式化错误。
error := fmt.Errorf("%d is negative\nAge can't be negative", age)
在这里,您可以看到我们使用了格式说明符 %d
来在我们的错误中使用 age 的值。
示例:使用 Errorf() 的错误
package main
import "fmt"
func divide(num1, num2 int) error {
// returns error
if num2 == 0 {
return fmt.Errorf("%d / %d\nCannot Divide a Number by zero", num1, num2)
}
// returns the result of division
return nil
}
func main() {
err := divide(4,0)
// error found
if err != nil {
fmt.Printf("error: %s", err)
// error not found
} else {
fmt.Println("Valid Division")
}
}
输出
error: 4 / 0 Cannot Divide a Number by zero
在上面的示例中,我们创建了一个名为 divide()
的函数。
func divide(num1, num2 int) error {...}
此函数的返回值为 error
,这意味着此函数将返回一个错误值。
在函数内部,我们使用 Errorf()
创建了一个格式化错误。如果条件 num2==0
为真,则 divide 函数返回 Errorf()
中的错误消息。
但是,如果 num2 不等于0,我们将返回 nil
,这表示没有错误。
Golang 中的自定义错误
在 Go 中,我们可以通过在 struct 中实现 error
接口来创建自定义错误。
error 接口
type error interface {
Error() string
}
这里,如果发生错误,Error()
方法会以字符串形式返回错误消息。否则,它返回 nil
。
现在,要创建自定义错误,我们必须在 Go struct 上实现 Error()
方法。
让我们看一个例子,
package main
import "fmt"
type DivisionByZero struct {
message string
}
// define Error() method on the struct
func (z DivisionByZero) Error() string {
return "Number Cannot Be Divided by Zero"
}
func divide(n1 int, n2 int) (int, error) {
if n2 == 0 {
return 0, &DivisionByZero{}
} else {
return n1 / n2, nil
}
}
func main() {
number1 := 15
// change the value of number2 to get different result
number2 := 0
result, err := divide(number1, number2)
// check if error occur or not
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Result: %d", result)
}
}
输出
Number Cannot Be Divided by Zero
在上面的示例中,我们在 DivisionByZero
struct 上实现了 error
接口的 Error()
方法。
func (z DivisionByZero) Error() string {
return "Number Cannot Be Divided by Zero"
}
这里,
z DivisionByZero
-DivisionByZero
struct 的一个实例string
- 方法的返回类型“Number Cannot Be Divided by Zero”
- 错误消息
然后我们创建了一个 divide()
方法,该方法接受两个参数并返回 result 和一个 error
。
func divide(n1 int, n2 int) (int, error) {...}
如果 n2 的值为0,则该函数返回0 和 &DivisionByZero{}
。这里,&DivisionByZero{}
是 struct 的一个实例。要了解更多信息,请访问 Go Pointers to Struct。
在 main()
函数中,如果返回的错误类型不是 nil
,我们则打印错误消息。
请注意,我们没有在程序中的任何地方调用 Error()
方法,但我们可以通过 struct 实例访问其返回值。