From ac43e0b8de4a4e74fc299111ae66e5afa4f2852a Mon Sep 17 00:00:00 2001 From: vCaesar Date: Sat, 10 Jun 2017 12:26:04 +0800 Subject: [PATCH] Format and remove 12.2.md spaces --- zh/12.2.md | 134 ++++++++++++++++++++++++++--------------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/zh/12.2.md b/zh/12.2.md index 1c43f319..0fb6acc6 100644 --- a/zh/12.2.md +++ b/zh/12.2.md @@ -33,79 +33,79 @@ ```html - - - - 找不到页面 - + + + + 找不到页面 + - - -
-
-
-
-

404!

-

{{.ErrorInfo}}

-
-
-
-
- - + + +
+
+
+
+

404!

+

{{.ErrorInfo}}

+
+
+
+
+ + ``` 另一个源码: ```html - - - - 系统错误页面 - + + + + 系统错误页面 + - - -
-
-
-
-

系统暂时不可用!

-

{{.ErrorInfo}}

-
-
-
-
- - + + +
+
+
+
+

系统暂时不可用!

+

{{.ErrorInfo}}

+
+
+
+
+ + ``` 404的错误处理逻辑,如果是系统的错误也是类似的操作,同时我们看到在: ```Go - func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/" { - sayhelloName(w, r) - return - } - NotFound404(w, r) - return - } + func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/" { + sayhelloName(w, r) + return + } + NotFound404(w, r) + return + } - func NotFound404(w http.ResponseWriter, r *http.Request) { - log.Error("页面找不到") //记录错误日志 - t, _ = t.ParseFiles("tmpl/404.html", nil) //解析模板文件 - ErrorInfo := "文件找不到" //获取当前用户信息 - t.Execute(w, ErrorInfo) //执行模板的merger操作 - } + func NotFound404(w http.ResponseWriter, r *http.Request) { + log.Error("页面找不到") //记录错误日志 + t, _ = t.ParseFiles("tmpl/404.html", nil) //解析模板文件 + ErrorInfo := "文件找不到" //获取当前用户信息 + t.Execute(w, ErrorInfo) //执行模板的merger操作 + } - func SystemError(w http.ResponseWriter, r *http.Request) { - log.Critical("系统错误") //系统错误触发了Critical,那么不仅会记录日志还会发送邮件 - t, _ = t.ParseFiles("tmpl/error.html", nil) //解析模板文件 - ErrorInfo := "系统暂时不可用" //获取当前用户信息 - t.Execute(w, ErrorInfo) //执行模板的merger操作 - } + func SystemError(w http.ResponseWriter, r *http.Request) { + log.Critical("系统错误") //系统错误触发了Critical,那么不仅会记录日志还会发送邮件 + t, _ = t.ParseFiles("tmpl/error.html", nil) //解析模板文件 + ErrorInfo := "系统暂时不可用" //获取当前用户信息 + t.Execute(w, ErrorInfo) //执行模板的merger操作 + } ``` ## 如何处理异常 @@ -114,16 +114,16 @@ 但是还有一种情况,有一些操作几乎不可能失败,而且在一些特定的情况下也没有办法返回错误,也无法继续执行,这样情况就应该panic。举个例子:如果一个程序计算x[j],但是j越界了,这部分代码就会导致panic,像这样的一个不可预期严重错误就会引起panic,在默认情况下它会杀掉进程,它允许一个正在运行这部分代码的goroutine从发生错误的panic中恢复运行,发生panic之后,这部分代码后面的函数和代码都不会继续执行,这是Go特意这样设计的,因为要区别于错误和异常,panic其实就是异常处理。如下代码,我们期望通过uid来获取User中的username信息,但是如果uid越界了就会抛出异常,这个时候如果我们没有recover机制,进程就会被杀死,从而导致程序不可服务。因此为了程序的健壮性,在一些地方需要建立recover机制。 ```Go - func GetUser(uid int) (username string) { - defer func() { - if x := recover(); x != nil { - username = "" - } - }() +func GetUser(uid int) (username string) { + defer func() { + if x := recover(); x != nil { + username = "" + } + }() - username = User[uid] - return - } + username = User[uid] + return +} ``` 上面介绍了错误和异常的区别,那么我们在开发程序的时候如何来设计呢?规则很简单:如果你定义的函数有可能失败,它就应该返回一个错误。当我调用其他package的函数时,如果这个函数实现的很好,我不需要担心它会panic,除非有真正的异常情况发生,即使那样也不应该是我去处理它。而panic和recover是针对自己开发package里面实现的逻辑,针对一些特殊情况来设计。