Filtering exceptions on exception messages in F#
May 6, 2017 Leave a comment
Here’s an example of pattern matching in a with clause in F#:
let testDotNetExceptions = try raise (new System.IndexOutOfRangeException("Your list is not large enough")) with | 😕 System.IndexOutOfRangeException as ex -> printfn "Out of range: %s" ex.Message 0 | 😕 System.Exception as ex -> printfn "Something bad has happened: %s" ex.Message 0
If you don’t understand the above code then check out this post for details.
In F# we fine tune pattern matching with the “when” keyword within a with clause. “when” must be followed by a boolean expression. If it returns true then the exception will be handled in that block otherwise the pattern matching will continue. Here’s an example:
let testDotNetExceptions = try raise (new System.InsufficientMemoryException("You should increase your RAM")) with | 😕 System.IndexOutOfRangeException as ex -> printfn "Out of range: %s" ex.Message 0 | 😕 System.Exception as ex when ex.Message.IndexOf("RAM") > -1 -> printfn "Something RAM related has happened: %s" ex.Message 0 | 😕 System.Exception as ex -> printfn "Something bad has happened: %s" ex.Message 0
Check how “when” is testing for a piece of string to be present in the exception message. If you run the above code then the exception will be handled in the second pattern matching section, i.e. where the when clause evaluates to true.
View all F# related articles here.