【问题标题】:try-catch-finally idiom in smalltalksmalltalk 中的 try-catch-finally 习语
【发布时间】:2011-10-20 18:24:29
【问题描述】:

如何在 smalltalk 中实现 try-catch-finally 习语?我看到有on:do:ensure:,但没有on:do:ensure:。我一定是错过了什么。

【问题讨论】:

    标签: error-handling smalltalk try-catch-finally


    【解决方案1】:

    您可以将 #on:do 块包装在另一个带有 #ensure: 的块中。

    【讨论】:

    • 确实如此。我想到了,但不知何故我认为它会执行内部块两次,因为 #on:do: 和 #ensure: send #value.
    • #ensure:'s send of #value 将评估其内容,这会将#on:do: 发送到其内容,然后将#value 发送到最里面的块,这最终会做有用的东西。换句话说,两个#value 发送被发送到不同的块。
    【解决方案2】:

    如果你真的需要,可以给BlockClosure添加一个协议:

    #on: anErrorOrSet do: errorBlock ensure: finallyBlock
        [ self on: anErrorOrSet do: errorBlock ]
        ensure: finallyBlock
    

    它的行为就像 java 上的 try:catch:finally: 一样。

    这就是 smalltalk 的魔力(嗯,它的一小部分),如果没有满足您的需求,您可以随时扩展它:)

    【讨论】:

      【解决方案3】:

      我不确定我是否理解了您的问题,但如果我理解了并且您的意思是“如果异常被触发,如何处理异常,否则继续正常执行”,您可以这样做:

      [self doWhatever] on: SomeException do: [self handleSomeException].
      self continueNormally.
      

      查看 Exception 的所有子类,看看您可以捕获哪些类型的异常。

      希望对您有所帮助!

      【讨论】:

      • finally 块不仅在正常继续执行时执行,而且在像 Smalltalk #ensure: 这样的异常展开堆栈时执行。查看其他答案。
      【解决方案4】:

      这就是您可以在几乎所有 Smalltalk 方言中开箱即用的写法。

      [[ "try{}" ] 
          on: Error 
          do: [:ex | "catch{}"]]
              ensure: ["finally{}"]
      

      或者您可以按照@EstebanLM 的建议扩展 BlockClosure。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 2014-11-27
        • 2011-10-31
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 2011-02-20
        • 2019-02-28
        相关资源
        最近更新 更多