<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tomlk (liukun)</title>
    <link>https://ruby-china.org/tomlk</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>咨询下，有个土木行业的朋友想要转行做 Ruby 程序员，有没有公司能够提供实习的机会呢？</title>
      <description>&lt;p&gt;咨询下，有个土木行业的朋友想要转行做 Ruby 程序员，有没有公司能够提供实习的机会呢？
简单介绍下这位朋友：
2014 年毕业于中国地质大学（北京）土木工程专业，学历本科，毕业后在中建五局工作至今。由于感觉他所在的行业有一些不太能够接受的东西，另外一个月完全没有假期且连续几个月每天加班到 23 点后，所以考虑转行。
以前有一点 C 语言基础，学过一些基本的数据结构和算法，考过一个计算机二级，总的来说，编程基础较为薄弱，经验较少。
现在经过多方了解后，考虑进入互联网行业，希望能有一家公司接受他进行实习，对待遇没有太高要求，希望能够成长，可以吃苦耐劳。&lt;/p&gt;</description>
      <author>tomlk</author>
      <pubDate>Thu, 24 Sep 2015 23:06:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/27473</link>
      <guid>https://ruby-china.org/topics/27473</guid>
    </item>
    <item>
      <title>请问在 Rails 项目中使用 kafka 时关于消费消息有经验能分享下吗？</title>
      <description>&lt;p&gt;如题，求教在 Rails 项目中使用 kafka 时消费消息是否有什么好办法。&lt;/p&gt;

&lt;p&gt;我本人了解过 poseidon 和 posidon_cluster 这 2 个 gem，poseidon 对于生产消息支持良好，但是对于消费消息支持有限。
poseidon_cluster 对于消费消息支持比 poseidon 好一些，但是使用 fetch_loop 方法的话，默认情况下会在超时没有收到新消息会抛出异常，
这样就需要有监控重启进程的机制。&lt;/p&gt;

&lt;p&gt;想了解下是否有人在实际项目中用到了 kafka，如果有消费消息的话，有什么经验教训可以分享下吗？
多谢~&lt;/p&gt;</description>
      <author>tomlk</author>
      <pubDate>Thu, 03 Sep 2015 20:58:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/27184</link>
      <guid>https://ruby-china.org/topics/27184</guid>
    </item>
    <item>
      <title>Rails 中使用 Kafka 的 gem 介绍</title>
      <description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;Kafka 是目前比较热门的一个分布式消息系统，以高并发、高吞吐著称。&lt;/p&gt;
&lt;h2 id="Kafka相关资料"&gt;Kafka 相关资料&lt;/h2&gt;
&lt;p&gt;官方文档：&lt;a href="http://kafka.apache.org/" rel="nofollow" target="_blank"&gt;http://kafka.apache.org/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="官方推荐的处理Kafka的gem--poseidon"&gt;官方推荐的处理 Kafka 的 gem--poseidon&lt;/h2&gt;
&lt;p&gt;poseidon 支持 Kafka-0.8 以上版本，是 kafka 官方推荐的用于 ruby 程序的 gem，可以方便的生产消息，作为 producer 是比较好用的。
但是 poseidon 对于消费消息支持有限，只能指定 topic 和 partion 进行消费（这一点和该 gem 的作者本身确认过，然后他给我推荐了 poseidon_cluster）。&lt;/p&gt;
&lt;h2 id="Kafka消费消息的gem--poseidon_cluster"&gt;Kafka 消费消息的 gem--poseidon_cluster&lt;/h2&gt;&lt;h2 id="由来"&gt;由来&lt;/h2&gt;
&lt;p&gt;posidon 本身在消费消息时，只能指定 topic 和 partion 进行消费，而在实际应用中，我们往往更加关注某一个 topic 下的所有消息，
并不关心到底存储在哪个 partion 中。所以，poseidon_cluster 这个 gem 就应运而生。&lt;/p&gt;
&lt;h2 id="遇到的问题"&gt;遇到的问题&lt;/h2&gt;
&lt;p&gt;在实际使用过程中发现，在使用 fetch_loop 时，如果长时间没有新消息产生（大概是 1 分钟左右），则在一定时间后，该方法会抛出异常。
在网上搜索发现，有其他人遇到了类似的问题，但是没有一个良好的解决方案。&lt;/p&gt;

&lt;p&gt;之后，我仔细阅读了该 gem 的文档和部分相关源码，发现出现异常的原因是在调用系统的 select 方法时超时，而这个超时时间是可以设置的。
试验发现，在将超时时间设置为 48 小时后，在 18 小时内没有收到新消息时，fetch_loop 对应的进程仍然正常运行，没有抛出异常，再次产生新消息时仍然可以正常消费。&lt;/p&gt;
&lt;h2 id="TODO"&gt;TODO&lt;/h2&gt;
&lt;p&gt;后续会补充一些具体的示例和试验过程。&lt;/p&gt;</description>
      <author>tomlk</author>
      <pubDate>Thu, 03 Sep 2015 11:12:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/27178</link>
      <guid>https://ruby-china.org/topics/27178</guid>
    </item>
    <item>
      <title>Ruby 异常处理的几个细节</title>
      <description>&lt;h2 id="1， 异常发生时被自动赋值的变量"&gt;1，异常发生时被自动赋值的变量&lt;/h2&gt;
&lt;p&gt;$!         最后发生的异常（异常对象）
$@      最后发生的异常的位置信息&lt;/p&gt;

&lt;p&gt;示例：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;006&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;007&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;   &lt;span class="n"&gt;abc&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;rescue&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;011&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$@&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;012&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$@&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;013&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;NameError&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;NameError: undefined local variable or method `abc' for main:Object&amp;gt;&lt;/span&gt;
&lt;span class="no"&gt;Array&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"(irb):7:in `irb_binding'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `eval'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/context.rb:379:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:489:in `block (2 levels) in eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:623:in `signal_status'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:486:in `block in eval_in
put'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:245:in `block (2 levels) in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `loop'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `block in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/li
b/ruby/2.2.0/irb.rb:485:in `eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:395:in `block in start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/bin/irb:11:in `&amp;lt;main&amp;gt;'"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2，异常对象的方法"&gt;2，异常对象的方法&lt;/h2&gt;
&lt;p&gt;class    异常的种类
message   异常信息
backtrace   异常发生的位置信息（$@与$!.backtrace 是等价的）&lt;/p&gt;

&lt;p&gt;示例：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;004&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;005&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;   &lt;span class="n"&gt;abc&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;006&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;007&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backtrace&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;NameError&lt;/span&gt;
&lt;span class="s2"&gt;"undefined local variable or method `abc' for main:Object"&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"(irb):5:in `irb_binding'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `eval'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/context.rb:379:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:489:in `block (2 levels) in eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:623:in `signal_status'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:486:in `block in eval_in
put'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:245:in `block (2 levels) in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `loop'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `block in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/li
b/ruby/2.2.0/irb.rb:485:in `eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:395:in `block in start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/bin/irb:11:in `&amp;lt;main&amp;gt;'"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"(irb):5:in `irb_binding'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `eval'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/workspace.rb:86:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/context.rb:379:in `evaluate'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:489:in `block (2 levels) in eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:623:in `signal_status'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:486:in `block in eval
_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:245:in `block (2 levels) in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `loop'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:231:in `block in each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb/ruby-lex.rb:230:in `each_top_level_statement'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22
/lib/ruby/2.2.0/irb.rb:485:in `eval_input'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:395:in `block in start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `catch'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/lib/ruby/2.2.0/irb.rb:394:in `start'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"C:/Ruby22/bin/irb:11:in `&amp;lt;main&amp;gt;'"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="3, ensure，retry 和 rescue"&gt;3, ensure，retry 和 rescue&lt;/h2&gt;
&lt;p&gt;ensure：后处理，ensure 中的处理在程序跳出 begin~end 部分时一定会执行。&lt;/p&gt;

&lt;p&gt;retry：重试，在 rescue 中使用 retry 后，begin 以下的操作会再重做一遍。&lt;/p&gt;

&lt;p&gt;rescue 修饰符：可以和 if 修饰符一样提高代码简洁性。&lt;/p&gt;

&lt;p&gt;表达式 1  rescue   表达式 2&lt;/p&gt;

&lt;p&gt;等价于：&lt;/p&gt;

&lt;p&gt;begin
     表达式 1
rescue
    表达式 2
end&lt;/p&gt;

&lt;p&gt;示例：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="k"&gt;rescue&lt;/span&gt;  &lt;span class="mi"&gt;0&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tomlk</author>
      <pubDate>Thu, 03 Sep 2015 10:53:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/27177</link>
      <guid>https://ruby-china.org/topics/27177</guid>
    </item>
  </channel>
</rss>
