āĻāϰāϰ āĻāĻŦāĻ āĻā§āϏā§āĻāĻŋāĻ(Errors and Testing )
[ā§Ŧ.ā§§] āĻāϰāϰ (Error )
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻāϝāĻŧā§, āĻāϰāϰ āĻŦāϞāϤ⧠āĻā§āϞ āĻŦāĻž āϤā§āϰā§āĻāĻŋ āĻŦā§āĻāĻžāϝāĻŧ āϝāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§ āĻ āĻŋāĻ āĻŽāϤ⧠āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻ āĻšāϤ⧠āĻŦāĻžāϧāĻž āĻĻā§āϝāĻŧāĨ¤ āĻā§āϞ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ, āϤā§āϰā§āĻāĻŋāĻĒā§āϰā§āĻŖ āϞāĻāĻŋāĻ, āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻāύāĻĒā§āĻ , āĻĄāĻŋāĻĒā§āύāĻĄā§āύā§āϏāĻŋ āĻāĻžāϤā§ā§ āϏāĻŽāϏā§āϝāĻžāĻā§āϞ⧠āĻāĻžā§āĻžāĻ āύāĻžāύāĻžāύ āĻāĻžāϰāĻŖā§ āĻāϰāϰ āĻāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻļāĻž āĻāϰāĻŋ āĻĒā§āϰā§āĻŦ āĻ āĻāĻŋāĻā§āĻāϤāĻž āĻĨā§āĻā§ āĻāĻŽāϰāĻž āĻāĻŋāĻā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāϰāϰā§āϰ āϏāĻžāĻĨā§ āĻāϤā§āĻŽāϧā§āϝā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤāĨ¤ āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻŋāĻā§ āĻŦāĻšā§āϞ āĻĒāϰāĻŋāĻāĻŋāϤ āĻāϰāϰ āĻā§āϞ⧠āĻšāϞ⧠–Â
- āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻāϰāϰ
- āϰāĻžāύāĻāĻžāĻāĻŽ āĻāϰāϰ
- āĻāĻŽā§āĻĒāĻžāĻāϞā§āĻļāύ āĻāϰāϰ
- āϞāĻāĻŋāĻā§āϝāĻžāϞ āĻāϰāϰ
[ā§Ŧ.ā§§.ā§§] Go āϤ⧠āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ, āĻāĻĻā§āĻĻā§āĻļā§āϝ āĻāĻŦāĻ āĻĒā§āϰā§ā§āĻāύā§ā§āϤāĻž
āĻāϰāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻāϰ āĻāĻāĻāĻž āĻ āĻŦāĻŋāĻā§āĻā§āĻĻā§āĻĻā§āϝ āĻ āĻāĻļ āϤāĻžāĻ āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞāĻŋāĻ āĻāϰ āĻŦāĻŋāώā§āĻāĻž Go āĻāϰ āĻā§āώā§āϤā§āϰā§āĻ āĻā§āĻŦāĻ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤Â
Go āĻŽā§āϞāϤ āĻā§āύ⧠āĻĢāĻžāĻāĻļāύā§āϰ āĻļā§āώ āϰāĻŋāĻāĻžāϰā§āύ āĻā§āϝāĻžāϞ⧠āĻšāĻŋāϏā§āĻŦā§Â error āĻāĻžāĻāĻĒā§āϰ āĻāĻāĻāĻŋ āĻā§āϝāĻžāϞ⧠āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰ⧠āĻĨāĻžāĻā§āĨ¤ āĻŦāϰā§āϤāĻŽāĻžāύ⧠Go āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻŽāϧā§āϝ⧠āϏāĻŦāĻĨā§āĻā§ āĻŦā§ āĻā§āϝāĻžāϞā§āĻā§āĻāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āĻāĻĒāϰā§āϰ āĻĻāĻŋāĻā§āĻ āĻĨāĻžāĻāĻŦā§ āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻāĨ¤ āϤāĻžāĻ āĻāĻāĻžāĻā§ āĻāĻŽ āĻā§āϰā§āϤā§āĻŦ āĻĻāĻŋā§ā§ āĻŦāĻž āĻĒāĻžāĻļ āĻāĻžāĻāĻŋā§ā§ āϝāĻžāĻā§āĻž āĻā§āύā§āĻāĻžāĻŦā§āĻ āĻāĻāĻŋāϤ āĻšāĻŦā§ āύāĻžāĨ¤Â
āĻ āύā§āϝāĻžāύā§āϝ āĻŽā§āϞāϧāĻžāϰāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āϞā§āϝāĻžāĻāĻā§ā§ā§āĻāĻā§āϞ⧠āϝā§āĻŽāύ Java, Javascript,Python āĻŦāĻž C# āύāĻŋā§ā§ āĻĒā§āϰā§āĻŦā§ āĻāĻžāĻ āĻāϰ⧠āĻĨāĻžāĻāϞ⧠āĻšā§āϤ āĻāĻžāύāĻž āĻāĻā§ āϝā§, āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āϞā§āϝāĻžāĻāĻā§ā§ā§āĻāĻā§āϞā§āĻ āĻāĻā§āϏā§āĻĒāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽā§ āϝāĻāύ āĻāĻāĻāĻž āĻāĻā§āϏā§āĻĒāĻļāύ āĻĨā§āϰ⧠āĻāϰāĻž āĻšā§ āϤāĻāύ āĻā§āĻĄ āϏā§āĻāĻžāύā§āĻ āĻĨā§āĻŽā§ āĻāĻŋā§ā§ āĻāĻ āĻāĻā§āϏā§āĻĒāĻļāύ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āĻā§āύ⧠āĻā§āĻĄ āĻŦā§āϞāĻā§āϰ āĻā§āĻāĻā§ āύā§āĻŽā§ āĻĒā§ā§āĨ¤ āĻāĻ āĻāĻā§āϏā§āĻĒāĻļāύ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻ āĻŋāĻ āĻāϰ⧠āĻĻā§ā§ āϝ⧠āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒ āĻāĻŋ āĻšāĻŦā§ āĻāĻŦāĻ āĻā§āύ⧠āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āύāĻž āĻĒāĻžāĻā§āĻž āĻā§āϞ⧠āĻā§āĻĄ āĻā§āϰā§āϝāĻžāĻļ āĻāϰāĻŦā§ āĻŦāĻž āĻŦāύā§āϧ āĻšā§ā§ āϝāĻžāĻŦā§ –

āĻ āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āϞā§āϝāĻžāĻāĻā§ā§ā§āĻāĻā§āϞā§āϰ āĻŦāĻŋāĻĒāϰā§āϤā§, Go āĻāϰāϰāĻā§ āĻ āύāĻŋāĻŦāĻžāϰā§āϝ āĻšāĻŋāϏāĻžāĻŦā§ āĻŽā§āύ⧠āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻŦā§āϝāĻžāĻ-āĻāύā§āĻĄ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞā§āϰ āĻā§āώā§āϤā§āϰā§Â āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻāĻŋāϏāĻā§ āĻĒā§āϰāĻžāϝāĻŧāĻļāĻ āĻŦāĻžāĻāϰā§āϰ API āĻāϞ, āĻĄāĻžāĻāĻžāĻŦā§āϏ⧠read āĻāĻŦāĻ write āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞā§āĻ°Â āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰāϤ⧠āĻšā§āĨ¤ āĻāĻĒāϰā§āϰ āĻāĻžāĻāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āϝā§āĻā§āύā§āĻāĻž āĻĢā§āĻāϞ āĻšāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŽāύāĻāĻŋ āĻĄāĻžāĻāĻž āĻĒāĻžāϰā§āϏāĻŋāĻ āĻŦāĻž āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻ āĻāϰāĻžāϰ āĻā§āώā§āϤā§āϰā§āĻāĨ¤ āϝā§āĻšā§āϤā§Â Go āĻŽāĻžāϞā§āĻāĻŋāĻĒāϞ āϰāĻŋāĻāĻžāϰā§āύ āĻā§āϝāĻžāϞ⧠āϏāĻžāĻĒā§āϰā§āĻ āĻāϰ⧠āϤāĻžāĻ āĻāĻ āĻāϞāĻā§āϞ⧠āĻĨā§āĻā§ āϝ⧠āĻāϰāϰāĻ āϰāĻŋāĻāĻžāϰā§āύ āĻšāϤ⧠āĻĒāĻžāϰ⧠āĻāĻāĻž āϧāϰ⧠āύāĻŋā§ā§āĻ āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤Â
Go -āĻāϰ āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞāĻŋāĻ āĻāϰ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ, āĻŽāĻžāύ⧠āĻāϰāϰāĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ āϰāĻŋāĻāĻžāϰā§āύ āĻā§āϝāĻžāϞ⧠āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāύā§āϤāĻž āĻāϰāĻžāϰ āĻŦāĻŋāώā§āĻāĻž āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāĻŋāύā§āύ āĻ āύā§āϝāĻžāύā§āϝ āϞā§āϝāĻžāĻāĻā§ā§ā§āĻ āĻĨā§āĻā§āĨ¤
āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞāĻŋāĻ āĻāϰ āϏāĻŽā§ āĻšā§āϤ āĻāĻāĻāĻž āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āĻĄ āĻŦā§āϞāĻ āĻŦāĻžāϰ āĻŦāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāϤ⧠āĻĒāĻžāϰ⧠–Â
res, err := doSomething()
if err != nil {
// Handle error
}
āĻāĻŦāĻ āĻāĻāĻāĻž āϏāĻŽā§ āĻĒāϰ āĻŽāύ⧠āĻšāĻŦā§ āĻāĻŋāĻŦā§āϰā§āĻĄā§ āĻāĻāϰāĻāĻŽ āĻāĻāĻāĻŋ āĻŦāĻžāĻāύ āĻĨāĻžāĻāϞ⧠āĻŽāύ⧠āĻšā§ āĻā§āĻŦ āĻāĻžāϞ⧠āĻšāϤ⧠–

Go-āϤ⧠āĻāϰāϰ āĻā§Â āϰāĻŋāĻĒā§āϰā§āĻā§āύā§āĻ āĻāϰāĻž āĻšā§ āĻŦāĻŋāϞā§āĻ āĻāύ āĻāϰāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§Â āϝā§āĻāĻžāϤ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻŽā§āĻĨāĻĄ āϰā§ā§āĻā§āĨ¤
type error interface {
Error() string
}
āĻŽā§āϞāϤ, āĻāϰāϰ āĻšāĻā§āĻā§ āĻāĻŽāύ āĻāĻŋāĻā§ āϝāĻž āĻāĻŋāύāĻž āĻāĻ Error() āĻŽā§āĻĨāĻĄ āϏāĻŋāĻāύā§āĻāĻžāϰāĻā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰ⧠āĻāĻŦāĻ string āĻšāĻŋāϏā§āĻŦā§ āĻāĻāĻāĻŋ āĻāϰāϰ āĻŽā§āϏā§āĻ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤
Go-āϤ⧠āĻĒā§āϰāϧāĻžāύāϤ āĻĻā§āĻāϧāϰāĻŖā§āĻ°Â āĻāϰāϰ āϰāϝāĻŧā§āĻā§ –Â
- āĻŦāĻŋāϞā§āĻ āĻāύ āĻāϰāϰ (Built-in Error): Go-āϤā§, āĻŦā§āĻļ āĻāĻŋāĻā§ āĻŦāĻŋāϞā§āĻ āĻāύ āĻāϰāϰ āϰāϝāĻŧā§āĻā§, āϝāĻž āϏāĻāϰāĻžāĻāĻ°Â āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϰāĻžāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ āĻāϰāϰāĻā§āϞ⧠āĻāĻāĻāĻžāϰāĻā§ āĻāϰāĻ āĻ āϰā§āĻĨāĻĒā§āϰā§āĻŖ āĻāϰāϰ āĻŽā§āϏā§āĻ āĻĻāĻŋāϤ⧠āĻāĻŦāĻ āĻā§āĻĄā§ āϏāĻŽāϏā§āϝāĻžāĻā§āϞ⧠āĻĄāĻŋāĻŦāĻžāĻā§ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāϤā§, āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
Go-āϤ⧠āĻŦāĻŋāϞā§āĻ-āĻāύ āĻāϰāϰā§āϰ āĻāĻāĻāĻŋ āĻŽāĻāĻžāϰ āĻāĻĻāĻžāĻšāϰāĻŖ āĻšāϞ math.ErrNaN āĻāϰāϰāĨ¤ āĻŽā§āϞāϤ āĻāĻŖāύāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻā§āϝāĻžāϞāĻŋāĻĄ āϏāĻāĻā§āϝāĻž āύāĻž āĻšā§ā§ āĻĨāĻžāĻāϞ⧠āĻāĻ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻšā§āĨ¤ āĻāĻāĻāĻŋ āĻāĻŖāĻžāϤā§āĻŽāĻ āϏāĻāĻā§āϝāĻžāϰ āĻŦāϰā§āĻāĻŽā§āϞ āύā§āĻāϝāĻŧāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻ āϤā§āϰā§āĻāĻŋ āĻāĻāϤ⧠āĻĒāĻžāϰā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒāĻ-
_, err := math.Sqrt(-1)
if err == math.ErrNaN {
fmt.Println("Oops, I think I just broke math!")
}
Go-āϤ⧠āĻāϰā§āĻāĻāĻŋ āĻŦāĻŋāϞā§āĻ-āĻāύ āĻāϰāϰ āĻšāϞ os.ErrNotExist āĻāϰāϰāĨ¤ āϝāĻāύ āĻā§āύā§Â āĻĢāĻžāĻāĻļāύ āĻāĻŽāύ āĻā§āύ⧠āĻĢāĻžāĻāϞ āĻŦāĻž āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻāĻžā§ āϝā§āĻāĻž āĻāĻā§āϏāĻŋāϏā§āĻ āĻāϰ⧠āύāĻž, āϏā§āϏāĻŦ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āĻāĻ āĻāϰāϰāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠–
file, err := os.Open("nonexistent-file.txt")
if err != nil && os.IsNotExist(err) {
fmt.Println("Sorry, I can't find that file.")
}
2. āĻāĻžāϏā§āĻāĻŽ āĻāϰāϰ (Custom Error): āĻŦāĻŋāϞā§āĻ-āĻāύ āĻāϰāϰāĻā§āϞ⧠āĻāĻžāĻĄāĻŧāĻžāĻ, Go āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ errors.New() āĻĢāĻžāĻāĻļāύ (āϝā§āĻāĻž āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻŽāϰāĻž āĻāĻāĻā§ āĻĒāϰā§āĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻŦā§) āĻŦāĻž āĻāϰāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϏā§āĻāĻŽ āĻāϰāϰ āĻāĻžāĻāĻĒ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏā§āϝā§āĻ āĻĻā§ā§ āϝāĻžāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻāĻŽāϰāĻž āύāĻŋāĻā§āĻĻā§āϰ āĻŽāϤ⧠āĻāϰ⧠āĻāϰāϰ āĻŽā§āϏā§āĻ āĻ āĻŋāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāĻŋ āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻāϰāĻ āĻ āϰā§āĻĨāĻĒā§āϰā§āĻŖ āĻāϰāϰ āĻŽā§āϏā§āĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāϰāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻāύāĻā§āϝāĻžāĻĒāϏā§āϞā§āĻ āĻāϰāĻžāϰ āϏā§āϝā§āĻ āĻĻā§āϝāĻŧ –
type MyError string
func (e MyError) Error() string {
return string(e)
}
func myFunc() error {
// do something...
return MyError("Something went wrong!")
}
āĻŽā§āϞāϤ āĻāĻāĻžāύ⧠MyError āĻ, error āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ Error() āĻŽā§āĻĨāĻĄ āϏāĻŋāĻāύā§āĻāĻžāϰāĻā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽāϰāĻž āύāĻŋāĻā§āĻĻā§āϰ āĻŽāϤ⧠āĻāϰ⧠āĻāĻžāϏā§āĻāĻŽ āĻāϰāϰ āĻŽā§āϏā§āĻ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāĻāĻžā§āĻžāĻ āĻāĻžāĻāϞ⧠āĻāĻžāϏā§āĻāĻŽ Struct āĻĻāĻŋā§ā§āĻ āĻāϰāϰāĻā§ āϰāĻŋāĻĒā§āϰā§āĻā§āύā§āĻ āĻāϰāĻž āϝāĻžā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ –
package main
import "fmt"
func main() {
user := new(User)
user.FirstName = "Kawsar"
err := myFunc(*user)
fmt.Println(err.Error())
}
type MyError struct {
Code int
Message string
}
func (e MyError) Error() string {
return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
}
type User struct {
FirstName string
LastName string
}
func myFunc(user User) error {
if user.FirstName == "" {
return MyError{Code: 400, Message: "First name is required"}
}
if user.LastName == "" {
return MyError{Code: 400, Message: "Last name is required"}
}
return nil
}
//Output: Error 400: Last name is required
āĻāĻāĻžā§āĻžāĻ āĻāϰāĻ āĻāĻŋāĻā§ āĻāϰāϰ āĻšāϞāĻ
- āϰāĻžāύāĻāĻžāĻāĻŽ āĻāϰāϰ (Runtime Error): āĻāĻā§āϞ⧠āĻāĻŽāύ āĻāϰāϰ āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϰāĻžāύ āĻāĻžāĻāĻŽā§ āĻāĻā§, āϝā§āĻŽāύ āĻļā§āύā§āϝ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻāĻāĻŋ āĻŦāĻŋāĻāĻžāĻāύ, āĻ ā§āϝāĻžāϰā§āϰ āĻŦāĻžāĻāϰā§āϰ āĻāĻĒāĻžāĻĻāĻžāύ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
Â
- āĻĢāĻžāĻāĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āϰāĻŋāĻāĻžāϰā§āύāĻā§āϤ āĻāϰāϰ (Errors Returned by Functions): āĻāĻā§āώā§āϤā§āϰ⧠āĻā§āύ⧠āĻĢāĻžāĻāĻļāύ āϝāĻāύ āϏāĻĢāϞāĻāĻžāĻŦā§ āϤāĻžāϰ āĻ āĻĒāĻžāϰā§āĻļāύ āĻā§āϞ⧠āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĻž āϤāĻāύ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤ Go-āϤā§, āϝ⧠āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰ⧠āϏā§āĻā§āϞā§āϰ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āύ āĻāĻžāĻāĻĒ āĻĨāĻžāĻā§ (resultType, error)⧎ āĻāϰāϰ āĻāύā§āĻĄāĻŋāĻļāύ āϏāϤā§āϝ āĻšāϞ⧠āĻāϰāϰ āĻā§āϝāĻžāϞā§Â āĻāϰ āĻāϰāϰ āύāĻž āĻšāϞ⧠āĻāĻžāĻā§āĻāĻŋāϤ āĻĢāϞāĻžāĻĢāϞ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠–
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§, divide() āĻĢāĻžāĻāĻļāύ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻĻā§āĻāĻŋ float64 āϏāĻāĻā§āϝāĻž āύā§āϝāĻŧ āĻāĻŦāĻ āĻāĻāĻāĻŋ float64 āĻŽāĻžāύ āĻ āĻāĻāĻāĻŋ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻļā§āύā§āϝ āĻšāϞā§, āĻĢāĻžāĻāĻļāύ errors.New() āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻāϰāϰ āĻŦāĻžāϰā§āϤāĻž āϏāĻš āĻāĻāĻāĻŋ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤ āĻ āύā§āϝāĻĨāĻžāϝāĻŧ, āĻāĻāĻŋ āĻĻā§āĻāĻŋ āϏāĻāĻā§āϝāĻžāϰ āĻāĻžāĻāĻĢāϞ āĻāĻŖāύāĻž āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻāĻŋ āύāĻŋāϞ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤
[ā§Ŧ.ā§§.⧍] errors āĻĒā§āϝāĻžāĻā§āĻ
errors āĻĒā§āϝāĻžāĻā§āĻ āĻšāϞ Go āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āϞā§āϝāĻžāĻā§āĻā§āϝāĻŧā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāϞā§āĻ āĻāύ āĻĒā§āϝāĻžāĻā§āĻ āϝāĻžāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻāĻŽāϰāĻž āϏāĻšāĻā§āĻ āĻāϰāϰ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āĨ¤ āĻāĻāύ āĻāĻŽāϰāĻžÂ āĻāĻ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āϏāĻāϰāĻžāĻāϰ āĻŦā§āϝāĻŦāĻšā§āϤ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āύāĻŋā§ā§ āϧāĻžāϰāύāĻž āύāĻŋāĻŦā§āĻ-
- Is():
func Is(err, target error) bool
āĻĒāĻžāϏ āĻāϰāĻž āĻāϰāϰ āĻāĻŦāĻ āĻāĻžāϰā§āĻā§āĻ āĻāϰāϰ āĻāĻāĻ āĻāĻŋāύāĻž āϤāĻž āĻā§āĻ āĻāϰāϤ⧠Is āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ, āϏāĻŽāĻžāύ āĻšāϞ⧠true, āύāĻž āĻšāϞ⧠false āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§Â –
package main
import (
"errors"
"fmt"
"io/fs"
"os"
)
func main() {
if _, err := os.Open("non-existing"); err != nil {
if errors.Is(err, fs.ErrNotExist) {
fmt.Println("file does not exist")
} else {
fmt.Println(err)
}
}
}
//Output:
//file does not exist
2. New():
func New(text string) error
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻāĻāĻŋ string āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύā§āϝāĻŧ āĻāĻŦāĻ āϏā§āĻ string āĻ āύā§āϝāĻžā§ā§ āĻāĻāĻāĻŋ āύāϤā§āύ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠–
func main() {
err := errors.New("something went wrong")
if err != nil {
fmt.Print(err)
}
}
 3. As():
func As(err error, target any) bool
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ, errors.Is() āĻāϰ āĻ āύā§āϰā§āĻĒ āĻāĻ āϧāϰāύā§āϰ āĻāϰāϰ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāϰāϰ āĻāĻžāĻāĻĒ āĻāϰāĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āύā§ā§ āϤāĻžāϰāĻĒāϰ⧠āĻāĻāĻŋ āĻĒāĻžāϏ āĻā§āϤ āĻāϰāϰāĻāĻŋāϰ āĻā§āĻāύā§āϰ āĻĨāĻžāĻāĻž āĻ āύā§āϝāϏāĻŦ āĻāϰāϰā§āĻ°Â āĻāĻžāĻāĻĒā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĻāϤā§āϤ āĻāϰāϰ āĻāĻžāĻāĻĒ āĻŽā§āϞ⧠āĻāĻŋāύāĻž āϤāĻž āĻā§āĻ āĻāϰ⧠āĨ¤ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻāϰāϰ āĻāϰāĻ āĻāĻžāĻāĻĒ āĻŽāĻŋāϞ⧠āϝāĻžāϝāĻŧ, āϤāĻžāĻšāϞ⧠āĻĢāĻžāĻāĻļāύāĻāĻŋ true āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§, āύāĻž āĻšāϞ⧠āĻāĻāĻŋ false āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠–
func main() {
if _, err := os.Open("non-existing"); err != nil {
var pathError *fs.PathError
if errors.As(err, &pathError) {
fmt.Println("Failed at path:", pathError.Path)
} else {
fmt.Println(err)
}
}
}
//Output:
//Failed at path: non-existing
4. Join():
func Join(errs ...error) error
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻāĻā§āϝāĻ āĻāϰāϰ āĻāϰāĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āύā§ā§ āĻāĻŦāĻ āϏāĻŦāĻā§āϞ⧠āĻāϰāϰāĻā§ āĻāĻ āĻāϰ⧠āĻāĻāĻāĻŋ āϏāĻŋāĻā§āĻā§āϞ āĻāϰāϰ āĻŽā§āϏā§āĻ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠–
package main
import (
"errors"
"fmt"
)
func main() {
err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)
fmt.Println(err)
if errors.Is(err, err1) {
fmt.Println("err is err1")
}
if errors.Is(err, err2) {
fmt.Println("err is err2")
}
}
āĻāĻāĻāĻĒā§āĻ –Â
err1
err2
err is err1
err is err2
āĻāĻ āĻĒā§āϝāĻžāĻā§āĻ āĻāϰ āĻĢāĻžāĻāĻļāĻāύ āĻā§āϞ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāϤ⧠āĻāĻ āϞāĻŋāĻāĻāĻāĻŋ āĻāĻžāĻā§ āĻāϏāĻŦā§āĨ¤
[ā§Ŧ.ā§§.ā§Š] āĻĒā§āϝāĻžāύāĻŋāĻ āĻ āϰāĻŋāĻā§āĻāĻžāϰ (Panic & Recover)
Go āϤ⧠āĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄā§āϞāĻŋāĻ āĻāϰ āĻāύā§āϝ panic āĻāĻŦāĻ recover āύāĻžāĻŽā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻĻā§āĻāĻŋ āĻŦāĻŋāϞā§āĻ āĻāύ āĻĢāĻžāĻāĻļāύ āϰā§ā§āĻā§ āϝā§āĻā§āϞ⧠āĻĻāĻŋā§ā§ āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻŋāĻā§ āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āϏāĻŋāĻā§ā§ā§āĻļāύ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§ āĻā§āϰā§āϝāĻžāĻļ āĻāϰāĻž āĻĨā§āĻā§ āϰāĻā§āώāĻž āĻāϰāĻŋāĨ¤
Panic
panic āĻšāĻā§āĻā§ āĻāĻŽāύ āĻāĻāĻāĻž āĻĢāĻžāĻāĻļāύ āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āύāϰāĻŽāĻžāϞ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύ āϤāĻžā§āĻā§āώāύāĻŋāĻ āĻŦāύā§āϧ āĻāϰā§, āϏāĻŽāϏā§āϤ defer āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻ āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻāĻŋ āϞāĻ āĻŽā§āϏā§āĻ āĻĒā§āϰāĻŋāύā§āĻ āĻšāϝāĻŧ, āϝāĻžāϤ⧠āĻĒā§āϝāĻžāύāĻŋāĻ āĻā§āϝāĻžāϞ⧠(āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻŋ āĻāϰāϰ āĻŽā§āϏā§āĻ) āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏā§āĻā§āϝāĻžāĻ āĻā§āϰā§āϏ(āĻāĻāĻāĻž āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻŽā§ā§ āĻāϞ āϏā§āĻā§āϝāĻžāĻā§ āĻĨāĻžāĻāĻž āϏāĻŦāĻā§āϞ⧠āĻĢāĻžāĻāĻļāύ āĻāϞ) āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻĨāĻžāĻā§āĨ¤
panic āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāϰāĻŖā§ āĻāĻāϤ⧠āĻĒāĻžāϰā§, āϝā§āĻŽāύ āĻāĻāĻāĻŋ āύāĻŋāϞ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻž, āĻāĻāĻāĻŋ āϏāĻāĻā§āϝāĻžāĻā§ āĻļā§āύā§āϝ āĻĻāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰāĻž, āĻŦāĻž āϏā§āĻŽāĻžāϰ āĻŦāĻžāĻāϰā§āϰ āĻ ā§āϝāĻžāϰ⧠āĻāύā§āĻĄā§āĻā§āϏ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ, panic āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻāĻŦāĻ āĻā§āϰā§āϤāϰ āĻāĻŋāĻā§ āĻāĻā§āĻā§ āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āύāϰāĻŽāĻžāϞāĻŋ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻā§ āύāĻžāĨ¤
func main() {
divide(5)
}
func divide(x int) {
fmt.Printf("divide(%d) \n", x+0/x)
divide(x - 1)
}
āĻāĻāĻŦāĻžāϰ āĻļā§āύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻŋāĻāĻžāĻāĻĄ āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰāĻž āĻšāϞā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ panic āĻāϰāĻŦā§ , āϝāĻžāϰ āĻĢāϞ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻāĻāĻĒā§āĻ āĻšāĻŦā§ –
divide(5)
divide(4)
divide(3)
divide(2)
divide(1)
panic: runtime error: integer divide by zero
Goroutine 1 [running]:
main.divide(0x8053a8?)
d:/GoLang/Gobyexample/dummy.go:10 +0xa5
main.divide(0x1)
d:/GoLang/Gobyexample/dummy.go:11 +0x94
main.divide(0x2)
d:/GoLang/Gobyexample/dummy.go:11 +0x94
main.divide(0x3)
d:/GoLang/Gobyexample/dummy.go:11 +0x94
main.divide(0x4)
d:/GoLang/Gobyexample/dummy.go:11 +0x94
main.divide(0x5)
d:/GoLang/Gobyexample/dummy.go:11 +0x94
main.main()
d:/GoLang/Gobyexample/dummy.go:6 +0x1e
exit status 2
āĻāĻŽāϰāĻž āύāĻŋāĻāϏā§āĻŦ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻŦāĻŋāϞā§āĻ āĻāύ panic āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ –
func getArguments() {
if len(os.Args) == 1 {
panic("Not enough arguments!")
}
}
panic āĻĢāĻžāĻāĻļāύ āĻŽā§āϞāϤ āĻāĻŽāύāϏāĻŦ āĻā§āώā§āϤā§āϰā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤ āϝāĻāύ āĻāĻŽāύ āĻāĻŋāĻā§ āĻāĻā§ āϝāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻļāĻž āĻāϰā§āύāĻž āĻŦāĻž āύāϰāĻŽāĻžāϞ āĻā§ā§āϤ⧠āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āĻāϰ āĻā§āύ⧠āĻāĻĒāĻžā§ āĻĨāĻžāĻā§ āύāĻžāĨ¤
āύāĻŋāĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻĻā§āĻāĻžāύ⧠āĻšā§ā§āĻā§ āĻāĻŋāĻāĻžāĻŦā§, āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻāĻŋ panic āĻāϰāĻžāϰ āĻāĻā§ defer āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻšā§ā§ āĻĨāĻžāĻā§ –
func main() {
accessSlice([]int{1, 2, 5, 6, 7, 8}, 0)
}
func accessSlice(slice []int, index int) {
fmt.Printf("item %d, value %d \n", index, slice[index])
defer fmt.Printf("defer %d \n", index)
accessSlice(slice, index+1)
}
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻāĻāĻĒā§āĻ –
item 0, value 1
item 1, value 2
item 2, value 5
item 3, value 6
item 4, value 7
item 5, value 8
defer 5
defer 4
defer 3
defer 2
defer 1
defer 0
panic: runtime error: index out of range [6] with length 6
Goroutine 1 [running]:
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x6)
d:/GoLang/Gobyexample/dummy.go:10 +0x186
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x5)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x4)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x3)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x2)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x1)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.accessSlice({0xc000107f40?, 0x6, 0x6}, 0x0)
d:/GoLang/Gobyexample/dummy.go:12 +0x15c
main.main()
d:/GoLang/Gobyexample/dummy.go:6 +0x70
exit status 2
panic āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āĻŦāĻ āϏāϤāϰā§āĻāϤāĻžāϰ āϏāĻšāĻŋāϤ āĻāĻŦāĻ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϰāĻŋāĻāĻāĻžāϰ āĻāϰāĻž āϝāĻžā§ āύāĻž āĻāĻŽāύ āĻāϰāϰā§āϰ āĻā§āώā§āϤā§āϰā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āĻā§āϞ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĒāĻžāϝāĻŧ, āϤāĻŦā§ āĻāĻāĻŋ panic āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻāϰāϰ āϰāĻŋāĻāĻžāϰā§āĻ¨Â āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŋāύā§āϤ⧠āϝāĻĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϏāĻžāĻŽāĻā§āĻāϏā§āϝāĻĒā§āϰā§āĻŖ āĻ āĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻā§, āĻŦāĻž āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āϰā§āϤāϰ āĻāϰāϰā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϝāĻŧ āϝāĻž āĻāĻāĻŋ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻŦā§āϝāϰā§āĻĨ āĻšā§ , āϤāĻžāĻšāϞ⧠āĻāĻā§āώā§āϤā§āϰā§Â panic āĻāϰāĻž āĻāĻĒāϝā§āĻā§āϤ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
āϝāĻžāĻāĻšā§āĻ, āĻāĻāĻŋ āϞāĻā§āώā§āϝ āĻāϰāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āϝ⧠panic āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽā§ āĻā§āώā§āϤā§āϰā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤ, āύāϰāĻŽāĻžāϞ āĻāύā§āĻā§āϰā§āϞ āĻĢā§āϞ⧠āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦā§ āύāϝāĻŧāĨ¤
Â
RecoverÂ
āĻāĻŋāĻā§ āĻāĻŋāĻā§ āĻā§āώā§āϤā§āϰ⧠panic āĻāϰ āĻāĻžāϰāύ⧠āĻā§āϰā§āϝāĻžāĻļ āĻšā§ā§ āϝāĻžāĻā§āĻž āĻā§āύ⧠āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§ āĻŦāύā§āϧ āĻāϰāĻž āĻāĻāĻŋāϤ āύāϝāĻŧ āĻŦāϰāĻ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤ Go-āϤā§, “recover ” āĻāĻŋāĻāϝāĻŧāĻžāϰā§āĻĄāĻāĻŋ āĻāĻāĻāĻŋ panic āĻāϰāĻž āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤
āĻāĻāĻāĻŋ recover āĻĢāĻžāĻāĻļāύ āϏāϰā§āĻŦāĻĻāĻž āĻāĻāĻāĻŋ defer āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻŋāϤāϰ⧠āĻāϞ āĻāϰāĻž āĻāĻāĻŋāϤ āĻāĻžāϰāĻŖ defer āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ panic āĻāϰāϞā§āĻ āĻāĻžāĻ āĻāϰāĻž āĻŦāύā§āϧ āĻāϰ⧠āύāĻž, āϤāĻžāĻ āĻāϰ āĻāĻŋāϤāϰ⧠āĻĨāĻžāĻāĻž recover āĻĢāĻžāĻāĻļāύāĻāĻŋ panic āĻŦāύā§āϧ āĻāϰ⧠āĻĻā§āϝāĻŧ āĻāĻŦāĻ panic āĻāϰ āĻāϰāϰ āĻā§āϝāĻžāϞ⧠āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠–
package main
import "fmt"
func main() {
accessSlice([]int{1, 2, 5, 6, 7, 8}, 0)
}
func accessSlice(slice []int, index int) {
defer func() {
if p := recover(); p != nil {
fmt.Printf("internal error: %v", p)
}
}()
fmt.Printf("item %d, value %d \n", index, slice[index])
defer fmt.Printf("\n defer %d", index)
accessSlice(slice, index+1)
}
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻāĻāĻĒā§āĻ –
item 0, value 1
item 1, value 2
item 2, value 5
item 3, value 6
item 4, value 7
item 5, value 8
internal error: runtime error: index out of range [6] with length 6
defer 5
defer 4
defer 3
defer 2
defer 1
defer 0
āĻāĻĒāϰ⧠āĻāĻŽāϰāĻž āϝ⧠āĻā§āĻĄ āĻāϰā§āĻāĻŋ āϏā§āĻāĻžāύ⧠āĻāύā§āĻĄā§āĻā§āϏ 6 āĻšāϞā§āĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ panic āĻāϰ⧠defer āĻāϰāĻž āĻāĻžāĻ āĻā§āϞ⧠āĻļā§āώ āĻāϰ⧠āĻā§āϰā§āϝāĻžāĻļ āĻāϰāĻāĻŋāϞ⧠āĻāĻŋāύā§āϤ⧠āĻāĻāĻāĻŋ recover āĻĢāĻžāĻāĻļāύ āϝā§āĻ āĻāϰāĻžāϰ āĻĒāϰ⧠āĻāĻŽāϰāĻž āĻĻā§āĻāĻāĻŋ āĻāĻāύ āĻāϰ āĻāĻā§āϰ āĻŽāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻā§āϰā§āϝāĻžāĻļ āύāĻž āĻāϰ⧠āύāϰāĻŽāĻžāϞ āĻāύā§āĻā§āϰā§āϞ āĻĢā§āϞ⧠āĻ āύā§āϏāĻžāϰ⧠āĻāϞāĻā§, āĻāĻžāϰāύ panic āĻāϰāĻžāϰ āĻĒāϰ āϏā§āĻāĻž āĻāĻŽāĻžāĻĻā§āϰ defer āĻāϰāĻž āĻĢāĻžāĻāĻļāύāĻāĻŋāϤ⧠āĻĨāĻžāĻāĻžÂ recover āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āϝāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻā§āϰā§āϝāĻžāĻļ āĻāϰāĻž āĻĨā§āĻā§ āϰāĻā§āώāĻž āĻāϰā§āĨ¤
āύāĻŋāĻā§ āĻāĻŋāĻā§ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ āϰāϝāĻŧā§āĻā§ āϝā§āĻāĻžāύ⧠recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
- āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻāϰāϰāĻā§āϞ⧠āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ: āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāĻŽāύ āĻā§āύ⧠āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻāϰāϰā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšā§ āϝāĻž āύāϰāĻŽāĻžāϞāĻŋ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āĻā§āύ⧠āĻāĻĒāĻžā§ āύā§āĻ, āϤāĻžāĻšāϞ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻā§āϰā§āϝāĻžāĻļ āĻšāĻāϝāĻŧāĻž āĻĨā§āĻā§ āϰāĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻāĻŋ āĻāĻžāϞ āĻāĻĒāĻžā§ āĻšāϤ⧠āĻĒāĻžāϰ⧠āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻā§āϞāĻž āύāĻž āϝāĻžāϝāĻŧ āĻŦāĻž āĻāĻāĻāĻŋ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϏāĻāϝā§āĻ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧ, āϏā§āĻā§āώā§āϤā§āϰ⧠āĻāĻŽāϰāĻž āĻāϰāϰāĻāĻŋ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāϤ⧠āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āύāϰāĻŽāĻžāϞāĻŋ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝā§āϤ⧠recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
Â
- āϰāĻŋāϏā§āϰā§āϏ āĻā§āϞāĻŋāύ āĻāĻĒ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ: panic āĻāϰ āĻāĻžāϰāĻŖā§ āĻāĻāĻāĻŋ āĻāύāϏā§āĻā§āĻŦāϞ āĻ āĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĢā§āϞ⧠āϰāĻžāĻāĻž āϰāĻŋāϏā§āϰā§āϏāĻā§āϞ⧠āĻā§āϞāĻŋāύ āĻāĻĒ āĻŦāĻž āĻĢā§āϰ⧠āĻāϰāϤ⧠recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύ, āĻĒā§āϝāĻžāύāĻŋāĻā§āϰ āϏāĻŽāϝāĻŧ āĻā§āύ⧠āĻĢāĻžāĻāϞ āĻā§āϞāĻž āĻĨāĻžāĻāϞā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻŦā§āϰ āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§ āĻāĻŽāϰāĻž āĻĢāĻžāĻāϞāĻāĻŋ āĻŦāύā§āϧ āĻāϰāϤ⧠recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻĻā§āϰā§āĻāϏāĻŽā§ āϧāϰā§-āĻāϞāĻŽāĻžāύ āĻ
āĻĒāĻžāϰā§āĻļāύāĻā§āϞ⧠āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ: āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻĻā§āϰā§āĻ āϏāĻŽāϝāĻŧ āϝāĻžāĻŦāϤ āĻāĻžāϞāĻžāύā§āĻ°Â āϏāĻŽā§āĻāĻžāĻŦāύāĻž āĻĨāĻžāĻā§, āϤāĻŦā§ āϝ⧠āĻā§āύ⧠āϏāĻŽā§ āϏā§āĻāĻŋ panic āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāϧāϰāύā§āϰ āĻ
āĻŦāϏā§āĻĨāĻž āϏāĻžāĻŽāϞāĻžāϤ⧠āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻāϞāĻŽāĻžāύ āϰāĻžāĻāϤ⧠recover āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻāĻŋ āĻāĻžāϞ āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύ, āĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ āĻŦāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻĻā§āϰā§āĻāϏāĻŽā§ āϧāϰā§-āĻāϞāĻŽāĻžāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞā§āϰ āĻāύā§āϝāĨ¤