Module: Fear::Try
Overview
only non-fatal exceptions are caught by the combinators on Try. Serious system errors, on the other hand, will be thrown.
all Try combinators will catch exceptions and return failure unless otherwise specified in the documentation.
The Try represents a computation that may either result in an exception, or return a successfully computed value. Instances of Try, are either an instance of Success or Failure.
For example, Try can be used to perform division on a user-defined input, without the need to do explicit exception-handling in all of the places that an exception might occur.
An important property of Try shown in the above example is its ability to pipeline, or chain, operations, catching exceptions along the way. The flat_map and map combinators in the above example each essentially pass off either their successfully completed value, wrapped in the Success type for it to be further operated upon by the next combinator in the chain, or the exception wrapped in the Failure type usually to be simply passed on down the chain. Combinators such as recover_with and recover are designed to provide some type of default behavior in the case of failure.
Defined Under Namespace
Modules: Mixin
Instance Method Summary collapse
-
#any? {|value| ... } ⇒ Boolean
Returns
falseifFailureor returns the result of the application of the given predicate to theSuccessvalue. -
#each {|value| ... } ⇒ Try
Performs the given block if this is a
Success. -
#failure? ⇒ Boolean
Returns
trueif it is aFailure,falseotherwise. -
#flat_map {|value| ... } ⇒ Try
Returns the given block applied to the value from this
Successor returns this if this is aFailure. -
#flatten ⇒ Try
Transforms a nested
Try, ie, aSuccessofSuccess, into an un-nestedTry, ie, aSuccess. -
#get ⇒ any
Returns the value from this
Successor raise the exception if this is aFailure. -
#get_or_else(*args) ⇒ Object
Returns the value from this
Successor evaluates the given default argument if this is aFailure. -
#include?(other_value) ⇒ Boolean
Returns
trueif it has an element that is equal (as determined by ==) toother_value,falseotherwise. -
#map {|value| ... } ⇒ Object
Maps the given block to the value from this
Successor returns this if this is aFailure. -
#or_else(&default) ⇒ Try
Returns this
Tryif it’s aSuccessor the given default argument if this is aFailure. -
#recover {|exception| ... } ⇒ Try
Applies the given block to exception.
-
#recover_with {|exception| ... } ⇒ Try
Applies the given block to exception.
-
#select {|value| ... } ⇒ Try
Converts this to a
Failureif the predicate is not satisfied. -
#success? ⇒ Boolean
Returns
trueif it is aSuccess,falseotherwise. -
#to_a ⇒ Array
Returns an
Arraycontaining theSuccessvalue or an emptyArrayif this is aFailure. -
#to_either ⇒ Right<any>, Left<StandardError>
Returns
Leftwith exception if this is aFailure, otherwise returnsRightwithSuccessvalue. -
#to_option ⇒ Option
Returns an
Somecontaining theSuccessvalue or aNoneif this is aFailure.
Instance Method Details
#any? {|value| ... } ⇒ Boolean
Returns false if Failure or returns the result of the application of the given predicate to the Success value.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#each {|value| ... } ⇒ Try
if block raise an error, then this method may raise an exception.
Performs the given block if this is a Success.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#failure? ⇒ Boolean
Returns true if it is a Failure, false otherwise.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#flat_map {|value| ... } ⇒ Try
Returns the given block applied to the value from this Success or returns this if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#flatten ⇒ Try
Transforms a nested Try, ie, a Success of Success, into an un-nested Try, ie, a Success.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#get ⇒ any
Returns the value from this Success or raise the exception if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#get_or_else(&default) ⇒ any #get_or_else(default) ⇒ any
Returns the value from this Success or evaluates the given default argument if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#include?(other_value) ⇒ Boolean
Returns true if it has an element that is equal (as determined by ==) to other_value, false otherwise.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#map {|value| ... } ⇒ Object
Maps the given block to the value from this Success or returns this if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#or_else(&default) ⇒ Try
Returns this Try if it’s a Success or the given default argument if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#recover {|exception| ... } ⇒ Try
Applies the given block to exception. This is like map for the exception.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#recover_with {|exception| ... } ⇒ Try
Applies the given block to exception. This is like flat_map for the exception.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#select {|value| ... } ⇒ Try
Converts this to a Failure if the predicate is not satisfied.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#success? ⇒ Boolean
Returns true if it is a Success, false otherwise.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#to_a ⇒ Array
Returns an Array containing the Success value or an empty Array if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#to_either ⇒ Right<any>, Left<StandardError>
Returns Left with exception if this is a Failure, otherwise returns Right with Success value.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |
#to_option ⇒ Option
Returns an Some containing the Success value or a None if this is a Failure.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 |
# File 'lib/fear/try.rb', line 217 module Try # @private def left_class Failure end # @private def right_class Success end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Try { 4/2 } #=> #<Fear::Success value=2> # Try { 4/0 } #=> #<Fear::Failure value=#<ZeroDivisionError: divided by 0>> # Success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method will ensure any non-fatal exception )is caught and a # +Failure+ object is returned. # @return [Try] # def Try Success.new(yield) rescue => error Failure.new(error) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) fail TypeError, "not an error: #{exception}" unless exception.is_a?(StandardError) Failure.new(exception) end # @param value [any] # @return [Success] # def Success(value) Success.new(value) end end end |