【GoLang】panic defer recover 深入理解

来源:互联网 发布:淘宝女人针织衫 编辑:程序博客网 时间:2024/05/29 12:03
<div id="topics"> <div class = "post"> <h1 class = "postTitle"> <a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/junneyang/p/6078810.html">【GoLang】panic defer recover 深入理解</a> </h1> <div class="clear"></div> <div class="postBody"> <div id="cnblogs_post_body"><p><spanstyle="font-size: 24px; background-color: #ffff00">唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲!</span></p> <p>&nbsp;</p> <p><spanstyle="font-size: 18pt; background-color: #ff6600"><strong>我认为知乎上说的比较中肯的:</strong></span></p> <p><imgsrc="http://images2015.cnblogs.com/blog/722831/201611/722831-20161121100045393-1509035757.png"alt=""></p> <p>&nbsp;</p> <p>&nbsp;</p> <p><spanstyle="font-size: 18pt; background-color: #ffff00; color: #000000"><strong>1. The key lesson, however, is that errors are values and the full power of the Go programming language is available for processing them.</strong></span></p> <p><spanstyle="font-size: 18pt; background-color: #ffff00; color: #000000"><strong>2.&nbsp;Use the language to simplify your error handling.</strong></span></p> <p><spanstyle="font-size: 18pt; background-color: #ffff00; color: #000000"><strong>But remember: Whatever you do, always check your errors!</strong></span></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>Golang这么时尚的语言是没有类似try..catch 这种异常处理机制,而是使用 panic 和 recover处理异常. 其实相当于python的raise。</p> <p>golang的异常处理组合 panic,defer,recover,跟java中的try catch finially是类似的。 但是从语言的用户体验来说,不怎么好。 但考虑到golang的场景基本是系统高性能层面的,这种精准错误处理应该减少那种后遗症bug。</p> <p>&nbsp;</p> <p>该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。</p> <p><ahref="http://xiaorui.cc/?p=2909"target="_blank">http://xiaorui.cc/?p=2909</a></p> <p>&nbsp;</p> <p>使用panic抛出异常,抛出异常后将立即停止当前函数的执行并运行所有被defer的函数,然后将panic抛向上一层,直至程序carsh。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃,recover只有被defer后才是有意义的。</p> <p>&nbsp;</p> <p>必须注意:</p> <p>1. &nbsp; defer 需要放在 panic 之前定义,另外recover只有在 defer 调用的函数中才有效。<br>2. &nbsp; recover处理异常后,逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点.<br>3. &nbsp; 多个 defer 会形成 defer 栈,后定义的 defer 语句会被最先调用</p> <p>panic (主动爆出异常) 与 recover (收集异常)</p> <p>recover 用来对panic的异常进行捕获. panic 用于向上传递异常,执行顺序是在 defer 之后。&nbsp;</p> <p>我们举个含有异常的例子:</p> <p>&nbsp;</p> <div id="crayon-582e7976053e6642185418"class="crayon-syntax crayon-theme-solarized-light crayon-font-monaco crayon-os-pc print-yes notranslate"data-settings=" minimize scroll-mouseover expand"> <div class="crayon-toolbar" data-settings=" show"> <div class="crayon-tools"> <div class="crayon-button crayon-nums-button crayon-pressed"title="切换是否显示行编号">&nbsp;</div> <div class="crayon-button crayon-plain-button"title="纯文本显示代码">&nbsp;</div> <div class="crayon-button crayon-wrap-button"title="切换自动换行">&nbsp;</div> <div class="crayon-button crayon-copy-button"title="复制代码">&nbsp;</div> <div class="crayon-button crayon-popup-button"title="在新窗口中显示代码">&nbsp;</div>               <span class="crayon-language">Python</span></div>               </div> <div class="crayon-plain-wrap">&nbsp;</div> <div class="crayon-main"> <table class="crayon-table"> <tbody> <tr class="crayon-row"> <td class="crayon-nums " data-settings="show"> <div class="crayon-nums-content"> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-1">1</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-2">2</div> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-3">3</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-4">4</div> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-5">5</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-6">6</div> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-7">7</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-8">8</div> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-9">9</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-10">10</div> <div class="crayon-num" data-line="crayon-582e7976053e6642185418-11">11</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053e6642185418-12">12</div>               </div>               </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-582e7976053e6642185418-1"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053e6642185418-2"class="crayon-line crayon-striped-line"><spanclass="crayon-c">#xiaorui.cc</span></div> <div id="crayon-582e7976053e6642185418-3"class="crayon-line"><spanclass="crayon-i">func<spanclass="crayon-h"><spanclass="crayon-e">f<spanclass="crayon-sy">(<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-4"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-st">for<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></div> <div id="crayon-582e7976053e6642185418-5"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"1"<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-6"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">a<spanclass="crayon-h"><spanclass="crayon-o">:<spanclass="crayon-o">=<spanclass="crayon-h"><spanclass="crayon-sy">[<spanclass="crayon-sy">]<spanclass="crayon-k">string<spanclass="crayon-sy">{<spanclass="crayon-s">"a"<spanclass="crayon-sy">,<spanclass="crayon-s">"b"<spanclass="crayon-sy">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-7"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-v">a<spanclass="crayon-sy">[<spanclass="crayon-cn">3<spanclass="crayon-sy">]<spanclass="crayon-sy">)<spanclass="crayon-h">&nbsp;&nbsp;<spanclass="crayon-o">/<spanclass="crayon-o">/<spanclass="crayon-h"> 这里<spanclass="crayon-k">slice越界异常了</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-8"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-o">/<spanclass="crayon-o">*<spanclass="crayon-e">panic<spanclass="crayon-sy">(<spanclass="crayon-s">"bug"<spanclass="crayon-sy">)<spanclass="crayon-o">*<spanclass="crayon-o">/</span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-9"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"4"<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-10"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-k">time<spanclass="crayon-sy">.<spanclass="crayon-e">Sleep<spanclass="crayon-sy">(<spanclass="crayon-cn">1<spanclass="crayon-h"><spanclass="crayon-o">*<spanclass="crayon-h"><spanclass="crayon-k">time<spanclass="crayon-sy">.<spanclass="crayon-v">Second<spanclass="crayon-sy">)</span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053e6642185418-11"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-sy">}</span></span></div> <div id="crayon-582e7976053e6642185418-12"class="crayon-line crayon-striped-line"><spanclass="crayon-sy">}</span></div>               </div>               </td>               </tr>               </tbody>               </table>               </div>               </div> <p>&nbsp;</p> <p>如果你不把这个异常panic recover处理的化,那么就会发生下面的情况.</p> <div id="crayon-582e7976053f3279437826"class="crayon-syntax crayon-theme-solarized-light crayon-font-monaco crayon-os-pc print-yes notranslate"data-settings=" minimize scroll-mouseover expand"> <div class="crayon-toolbar" data-settings=" show"> <div class="crayon-tools"> <div class="crayon-button crayon-nums-button crayon-pressed"title="切换是否显示行编号">&nbsp;</div> <div class="crayon-button crayon-plain-button"title="纯文本显示代码">&nbsp;</div> <div class="crayon-button crayon-wrap-button"title="切换自动换行">&nbsp;</div> <div class="crayon-button crayon-copy-button"title="复制代码">&nbsp;</div> <div class="crayon-button crayon-popup-button"title="在新窗口中显示代码">&nbsp;</div>               <span class="crayon-language">Python</span></div>               </div> <div class="crayon-plain-wrap">&nbsp;</div> <div class="crayon-main"> <table class="crayon-table"> <tbody> <tr class="crayon-row"> <td class="crayon-nums " data-settings="show"> <div class="crayon-nums-content"> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-1">1</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-2">2</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-3">3</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-4">4</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-5">5</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-6">6</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-7">7</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-8">8</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-9">9</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-10">10</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-11">11</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f3279437826-12">12</div> <div class="crayon-num" data-line="crayon-582e7976053f3279437826-13">13</div>               </div>               </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-582e7976053f3279437826-1"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053f3279437826-2"class="crayon-line crayon-striped-line"><spanclass="crayon-c">#xiaorui.cc</span></div> <div id="crayon-582e7976053f3279437826-3"class="crayon-line"><spanclass="crayon-cn">1</span></div> <div id="crayon-582e7976053f3279437826-4"class="crayon-line crayon-striped-line"><spanclass="crayon-v">panic<spanclass="crayon-o">:<spanclass="crayon-h"><spanclass="crayon-e">runtime<spanclass="crayon-v">error<spanclass="crayon-o">:<spanclass="crayon-h"><spanclass="crayon-e">index<spanclass="crayon-e">out<spanclass="crayon-e">of<spanclass="crayon-k">range</span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-5"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053f3279437826-6"class="crayon-line crayon-striped-line"><spanclass="crayon-i">goroutine<spanclass="crayon-h"><spanclass="crayon-cn">1<spanclass="crayon-h"><spanclass="crayon-sy">[<spanclass="crayon-v">running<spanclass="crayon-sy">]<spanclass="crayon-o">:</span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-7"class="crayon-line"><spanclass="crayon-e">panic<spanclass="crayon-sy">(<spanclass="crayon-cn">0xda9c0<spanclass="crayon-sy">,<spanclass="crayon-h"><spanclass="crayon-cn">0x8201c8090<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-8"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-o">/<spanclass="crayon-v">usr<spanclass="crayon-o">/<spanclass="crayon-v">local<spanclass="crayon-o">/<spanclass="crayon-v">go<spanclass="crayon-o">/<spanclass="crayon-v">src<spanclass="crayon-o">/<spanclass="crayon-v">runtime<spanclass="crayon-o">/<spanclass="crayon-v">panic<spanclass="crayon-sy">.<spanclass="crayon-v">go<spanclass="crayon-o">:<spanclass="crayon-cn">464<spanclass="crayon-h"><spanclass="crayon-o">+<spanclass="crayon-cn">0x3e6</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-9"class="crayon-line"><spanclass="crayon-v">main<spanclass="crayon-sy">.<spanclass="crayon-e">f<spanclass="crayon-sy">(<spanclass="crayon-sy">)</span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-10"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-o">/<spanclass="crayon-v">Users<spanclass="crayon-o">/<spanclass="crayon-v">ruifengyun<spanclass="crayon-o">/<spanclass="crayon-v">gg<spanclass="crayon-sy">.<spanclass="crayon-v">go<spanclass="crayon-o">:<spanclass="crayon-cn">23<spanclass="crayon-h"><spanclass="crayon-o">+<spanclass="crayon-cn">0x33b</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-11"class="crayon-line"><spanclass="crayon-v">main<spanclass="crayon-sy">.<spanclass="crayon-e">main<spanclass="crayon-sy">(<spanclass="crayon-sy">)</span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-12"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-o">/<spanclass="crayon-v">Users<spanclass="crayon-o">/<spanclass="crayon-v">ruifengyun<spanclass="crayon-o">/<spanclass="crayon-v">gg<spanclass="crayon-sy">.<spanclass="crayon-v">go<spanclass="crayon-o">:<spanclass="crayon-cn">16<spanclass="crayon-h"><spanclass="crayon-o">+<spanclass="crayon-cn">0x14</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f3279437826-13"class="crayon-line"><spanclass="crayon-e">exit<spanclass="crayon-i">status<spanclass="crayon-h"><spanclass="crayon-cn">2</span></span></span></span></div>               </div>               </td>               </tr>               </tbody>               </table>               </div>               </div> <p>&nbsp;</p> <p>下面是处理panic的例子.&nbsp;</p> <p>&nbsp;</p> <div id="crayon-582e7976053f8970549624"class="crayon-syntax crayon-theme-solarized-light crayon-font-monaco crayon-os-pc print-yes notranslate"data-settings=" minimize scroll-mouseover expand"> <div class="crayon-toolbar" data-settings=" show"> <div class="crayon-tools"> <div class="crayon-button crayon-nums-button crayon-pressed"title="切换是否显示行编号">&nbsp;</div> <div class="crayon-button crayon-plain-button"title="纯文本显示代码">&nbsp;</div> <div class="crayon-button crayon-wrap-button"title="切换自动换行">&nbsp;</div> <div class="crayon-button crayon-copy-button"title="复制代码">&nbsp;</div> <div class="crayon-button crayon-popup-button"title="在新窗口中显示代码">&nbsp;</div>               <span class="crayon-language">Python</span></div>               </div> <div class="crayon-plain-wrap">&nbsp;</div> <div class="crayon-main"> <table class="crayon-table"> <tbody> <tr class="crayon-row"> <td class="crayon-nums " data-settings="show"> <div class="crayon-nums-content"> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-1">1</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-2">2</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-3">3</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-4">4</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-5">5</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-6">6</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-7">7</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-8">8</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-9">9</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-10">10</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-11">11</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-12">12</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-13">13</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-14">14</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-15">15</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-16">16</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-17">17</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-18">18</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-19">19</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-20">20</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-21">21</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-22">22</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-23">23</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-24">24</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-25">25</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053f8970549624-26">26</div> <div class="crayon-num" data-line="crayon-582e7976053f8970549624-27">27</div>               </div>               </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-582e7976053f8970549624-1"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053f8970549624-2"class="crayon-line crayon-striped-line"><spanclass="crayon-e">package<spanclass="crayon-e">main</span></span></div> <div id="crayon-582e7976053f8970549624-3"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053f8970549624-4"class="crayon-line crayon-striped-line"><spanclass="crayon-r">import<spanclass="crayon-h"><spanclass="crayon-sy">(</span></span></span></div> <div id="crayon-582e7976053f8970549624-5"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-s">"fmt"</span></span></div> <div id="crayon-582e7976053f8970549624-6"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-s">"time"</span></span></div> <div id="crayon-582e7976053f8970549624-7"class="crayon-line"><spanclass="crayon-sy">)</span></div> <div id="crayon-582e7976053f8970549624-8"class="crayon-line crayon-striped-line">&nbsp;</div> <div id="crayon-582e7976053f8970549624-9"class="crayon-line"><spanclass="crayon-e">func<spanclass="crayon-e">main<spanclass="crayon-sy">(<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-10"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-e">defer<spanclass="crayon-e">func<spanclass="crayon-sy">(<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-sy">{<spanclass="crayon-h"><spanclass="crayon-o">/<spanclass="crayon-o">/必须要先声明<spanclass="crayon-i">defer,否则不能捕获到<spanclass="crayon-i">panic异常</span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-11"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"2"<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-12"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-st">if<spanclass="crayon-h"><spanclass="crayon-v">err<spanclass="crayon-h"><spanclass="crayon-o">:<spanclass="crayon-o">=<spanclass="crayon-h"><spanclass="crayon-e">recover<spanclass="crayon-sy">(<spanclass="crayon-sy">)<spanclass="crayon-sy">;<spanclass="crayon-h"><spanclass="crayon-v">err<spanclass="crayon-h"><spanclass="crayon-o">!=<spanclass="crayon-h"><spanclass="crayon-e">nil<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-13"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-v">err<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-o">/<spanclass="crayon-o">/这里的<spanclass="crayon-i">err其实就是<spanclass="crayon-i">panic传入的内容,<spanclass="crayon-i">bug</span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-14"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-sy">}</span></span></div> <div id="crayon-582e7976053f8970549624-15"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"3"<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-16"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-sy">}<spanclass="crayon-sy">(<spanclass="crayon-sy">)</span></span></span></span></div> <div id="crayon-582e7976053f8970549624-17"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-e">f<spanclass="crayon-sy">(<spanclass="crayon-sy">)</span></span></span></span></div> <div id="crayon-582e7976053f8970549624-18"class="crayon-line crayon-striped-line"><spanclass="crayon-sy">}</span></div> <div id="crayon-582e7976053f8970549624-19"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053f8970549624-20"class="crayon-line crayon-striped-line"><spanclass="crayon-i">func<spanclass="crayon-h"><spanclass="crayon-e">f<spanclass="crayon-sy">(<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-21"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-st">for<spanclass="crayon-h"><spanclass="crayon-sy">{</span></span></span></span></div> <div id="crayon-582e7976053f8970549624-22"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"1"<spanclass="crayon-sy">)</span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-23"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-e">panic<spanclass="crayon-sy">(<spanclass="crayon-s">"bug"<spanclass="crayon-sy">)</span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-24"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-v">fmt<spanclass="crayon-sy">.<spanclass="crayon-e">Println<spanclass="crayon-sy">(<spanclass="crayon-s">"4"<spanclass="crayon-sy">)<spanclass="crayon-h"><spanclass="crayon-o">/<spanclass="crayon-o">/不会运行的<spanclass="crayon-sy">.</span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-25"class="crayon-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-k">time<spanclass="crayon-sy">.<spanclass="crayon-e">Sleep<spanclass="crayon-sy">(<spanclass="crayon-cn">1<spanclass="crayon-h"><spanclass="crayon-o">*<spanclass="crayon-h"><spanclass="crayon-k">time<spanclass="crayon-sy">.<spanclass="crayon-v">Second<spanclass="crayon-sy">)</span></span></span></span></span></span></span></span></span></span></span></span></span></div> <div id="crayon-582e7976053f8970549624-26"class="crayon-line crayon-striped-line"><spanclass="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;<spanclass="crayon-sy">}</span></span></div> <div id="crayon-582e7976053f8970549624-27"class="crayon-line"><spanclass="crayon-sy">}</span></div>               </div>               </td>               </tr>               </tbody>               </table>               </div>               </div> <p>那么上面代码的运行结果是:</p> <div id="crayon-582e7976053fe840889847"class="crayon-syntax crayon-theme-solarized-light crayon-font-monaco crayon-os-pc print-yes notranslate"data-settings=" minimize scroll-mouseover expand"> <div class="crayon-toolbar" data-settings=" show"> <div class="crayon-tools"> <div class="crayon-button crayon-nums-button crayon-pressed"title="切换是否显示行编号">&nbsp;</div> <div class="crayon-button crayon-plain-button"title="纯文本显示代码">&nbsp;</div> <div class="crayon-button crayon-wrap-button"title="切换自动换行">&nbsp;</div> <div class="crayon-button crayon-copy-button"title="复制代码">&nbsp;</div> <div class="crayon-button crayon-popup-button"title="在新窗口中显示代码">&nbsp;</div>               <span class="crayon-language">Python</span></div>               </div> <div class="crayon-plain-wrap">&nbsp;</div> <div class="crayon-main"> <table class="crayon-table"> <tbody> <tr class="crayon-row"> <td class="crayon-nums " data-settings="show"> <div class="crayon-nums-content"> <div class="crayon-num" data-line="crayon-582e7976053fe840889847-1">1</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053fe840889847-2">2</div> <div class="crayon-num" data-line="crayon-582e7976053fe840889847-3">3</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e7976053fe840889847-4">4</div> <div class="crayon-num" data-line="crayon-582e7976053fe840889847-5">5</div>               </div>               </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-582e7976053fe840889847-1"class="crayon-line">&nbsp;</div> <div id="crayon-582e7976053fe840889847-2"class="crayon-line crayon-striped-line"><spanclass="crayon-cn">1</span></div> <div id="crayon-582e7976053fe840889847-3"class="crayon-line"><spanclass="crayon-cn">2</span></div> <div id="crayon-582e7976053fe840889847-4"class="crayon-line crayon-striped-line"><spanclass="crayon-i">bug</span></div> <div id="crayon-582e7976053fe840889847-5"class="crayon-line"><spanclass="crayon-cn">3</span></div>               </div>               </td>               </tr>               </tbody>               </table>               </div>               </div> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>上面go代码实例中,异常是我们通过panic方法主动抛出来的,但如果真的就出现了未知的异常咋办?</p> <div>&nbsp;</div> <div>我们可以看到出现的异常会走到defer这一步,defer这里可以打印具体的异常信息,defer运行完之后不能回到原点,控制权会被扔到该函数的外层,也就是调用这个函数的层,对应上面的代码也就是main()函数。</div> <div>&nbsp;</div> <p>上面go代码运行结果是:</p> <div> <div id="crayon-582e797605408017935650"class="crayon-syntax crayon-theme-solarized-light crayon-font-monaco crayon-os-pc print-yes notranslate"data-settings=" minimize scroll-mouseover expand"> <div class="crayon-toolbar" data-settings=" show"> <div class="crayon-tools"> <div class="crayon-button crayon-nums-button crayon-pressed"title="切换是否显示行编号">&nbsp;</div> <div class="crayon-button crayon-plain-button"title="纯文本显示代码">&nbsp;</div> <div class="crayon-button crayon-wrap-button"title="切换自动换行">&nbsp;</div> <div class="crayon-button crayon-copy-button"title="复制代码">&nbsp;</div> <div class="crayon-button crayon-popup-button"title="在新窗口中显示代码">&nbsp;</div>               <span class="crayon-language">Python</span></div>               </div> <div class="crayon-plain-wrap">&nbsp;</div> <div class="crayon-main"> <table class="crayon-table"> <tbody> <tr class="crayon-row"> <td class="crayon-nums " data-settings="show"> <div class="crayon-nums-content"> <div class="crayon-num" data-line="crayon-582e797605408017935650-1">1</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e797605408017935650-2">2</div> <div class="crayon-num" data-line="crayon-582e797605408017935650-3">3</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e797605408017935650-4">4</div> <div class="crayon-num" data-line="crayon-582e797605408017935650-5">5</div> <div class="crayon-num crayon-striped-num"data-line="crayon-582e797605408017935650-6">6</div>               </div>               </td> <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-582e797605408017935650-1"class="crayon-line">&nbsp;</div> <div id="crayon-582e797605408017935650-2"class="crayon-line crayon-striped-line"><spanclass="crayon-cn">1</span></div> <div id="crayon-582e797605408017935650-3"class="crayon-line"><spanclass="crayon-v">xiaorui<spanclass="crayon-sy">.<spanclass="crayon-e">cc<spanclass="crayon-e">start</span></span></span></span></div> <div id="crayon-582e797605408017935650-4"class="crayon-line crayon-striped-line"><spanclass="crayon-e">runtime<spanclass="crayon-v">error<spanclass="crayon-o">:<spanclass="crayon-h"><spanclass="crayon-e">index<spanclass="crayon-e">out<spanclass="crayon-e">of<spanclass="crayon-k">range</span></span></span></span></span></span></span></span></div> <div id="crayon-582e797605408017935650-5"class="crayon-line"><spanclass="crayon-v">xiaorui<spanclass="crayon-sy">.<spanclass="crayon-e">cc<spanclass="crayon-e">end</span></span></span></span></div> <div id="crayon-582e797605408017935650-6"class="crayon-line crayon-striped-line"><spanclass="crayon-i">end</span></div>               </div>               </td>               </tr>               </tbody>               </table>               </div>               </div>               </div> <div>&nbsp;</div> <p>&nbsp;</p> <p>先前没在意defer&nbsp;&nbsp;recover &nbsp;panic的注意事项,结果各种问题出现了。 不知道go以后会不会有try catch异常模式, 很是期待…&nbsp;</p> <p>&nbsp;</p> <p>END.</p> <p>&nbsp;</p> <p><strong>参考资料:</strong></p> <p>http://xiaorui.cc/2016/03/09/%E5%85%B3%E4%BA%8Egolang%E7%9A%84panic-recover%E5%BC%82%E5%B8%B8%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86/</p> <p>http://www.linuxidc.com/Linux/2013-04/83105.htm</p> <p>http://blog.csdn.net/wuwenxiang91322/article/details/9042503</p> <p>&nbsp;https://www.zhihu.com/question/27158146</p></div><divid="MySignature"></div> <div class="clear"></div> <div id="blog_post_info_block"> <div id="BlogPostCategory"></div> <div id="EntryTag"></div> <div id="blog_post_info"> </div> <div class="clear"></div> <div id="post_next_prev"></div> </div>    
0 0
原创粉丝点击