def catch_symbol expected_symbol, &block
      thrown_symbol, thrown_value = nil
      begin
        if expected_symbol
          thrown_value = catch :__ms__nothing_thrown do
            catch expected_symbol do
              block.call
              throw :__ms__nothing_thrown, :__ms__nothing_thrown
            end
          end
          thrown_symbol = expected_symbol unless thrown_value == :__ms__nothing_thrown
        else
          block.call
        end
      rescue => e
        raise(e) unless thrown_symbol = extract_thrown_symbol(e)
      end
      [thrown_symbol, thrown_value]
    end
def catch_symbol expected_symbol, &block
      thrown_symbol, thrown_value = nil
      begin
        if expected_symbol
          thrown_value = catch :__ms__nothing_thrown do
            catch expected_symbol do
              block.call
              throw :__ms__nothing_thrown, :__ms__nothing_thrown
            end
          end
          thrown_symbol = expected_symbol unless thrown_value == :__ms__nothing_thrown
        else
          block.call
        end
      rescue => e
        raise(e) unless thrown_symbol = extract_thrown_symbol(e)
      end
      [thrown_symbol, thrown_value]
    end
calling given block and catching thrown symbol, if any.

 @param expected_symbol
 @param [Proc] &block