# Be Brave

**URL:** <https://www.ruby-forum.com/t/be-brave/242903>\
**Category:** IT\
**Created:** [August 6, 2015, 12:12pm UTC](https://www.ruby-forum.com/t/be-brave/242903 "2015-08-06T12:12:16Z")\
**Posts on this page:** 6\
**Page:** 2

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 9:39am UTC](https://www.ruby-forum.com/t/be-brave/242903/21 "2015-08-07T09:39:17Z")

</div>

my 2c da bastian contrario, rispetto a quello che dice Maurizio De  
Santis 🙂

L’esempio specifico secondo me non “eccezioni come control flow”, in  
quanto non  
necessariamente sei tu che stai facendo raise dell’eccezione per avere  
un  
control flow non lineare.

Ovvero: eccezioni come control flow

def fetch(url)  
body, status = \_fetch(url)  
raise HttpError if status == 4xx  
raise EmptyBody if body.empty?  
raise InvalidJson unless body.valid\_json?  
end

mentre

data = fetch(url) rescue {}

solo “gestisci libreria”.

Ma concordo invece con il problema che l’esempio per come scritto  
pericoloso perch non c’ controllo su cosa dovrebbe gestire.

Per, ad esempio avendo a che fare con librerie che usano eccezioni in  
modo  
abbastanza liberale (praticamente tutte quelle che hanno a che fare con  
http), io ho spesso usato roba tipo

def ignoring(exception\_classes)

```
begin

  yield

rescue *exception_classes => e

  log_exception "error ", e

  # e per esempio in rails, qua metti anche un @error = ...

end

```

end  
…  
ignoring(RequestTimeOut, ConnectionError) {  
data = fetch\_data()  
do\_stuff\_with(data)  
}

Che altro non che “if”, con un altro nome.

YMMV 🙂

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 10:33am UTC](https://www.ruby-forum.com/t/be-brave/242903/22 "2015-08-07T10:33:02Z")

</div>

Ottima l’idea di limitare le eccezioni ignorate [gist](https://gist.github.com/olistik/bb3b2ebce1a72913d5a6) 🙂  
Ho aggiornato il post con questa implementazione.

2015-08-07 9:38 GMT+02:00 gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 10:42am UTC](https://www.ruby-forum.com/t/be-brave/242903/23 "2015-08-07T10:42:23Z")

</div>

+1

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 10:40am UTC](https://www.ruby-forum.com/t/be-brave/242903/24 "2015-08-07T10:40:38Z")

</div>

Ok, ma fallisce nei casi ibridi in cui la navigazione passa accesso  
tramite  
hash _e_ metodi, come nell’esempio originale:

```
params[:profile][:resume].tempfile.path

```

Al posto di creare un Optional ancora più complesso posso semplicemente  
usare l’implementazione di base con un wrap iniziale su una OpenStruct:

```
require 'ostruct'
require 'monads/optional'
include Monads

Optional.new(OpenStruct.new(params)).profile.resume.tempfile.path.value
```

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 10:44am UTC](https://www.ruby-forum.com/t/be-brave/242903/25 "2015-08-07T10:44:43Z")

</div>

Monadic Bravery 🙂

2015-08-07 10:39 GMT+02:00 maurizio de magnis  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 7, 2015, 11:18am UTC](https://www.ruby-forum.com/t/be-brave/242903/26 "2015-08-07T11:18:36Z")

</div>

Se non fosse che `Monads` sembra fare a botte con `OpenStruct`:

```
[25] pry(main)> Monads::Optional.new(OpenStruct.new({foo: 'bar', 

```

spam:  
{egg: ‘rick’}})).spam.egg.value  
NoMethodError: undefined method `egg' for {:egg=>"rick"}:Hash from /Users/olistik/.rvm/gems/ruby-2.2.2/gems/monads-0.0.1/lib/monads/monad.rb:11:in `public\_send’

mentre con `Hashie::Mash` sembra andare d’amore e d’accordo:

```
[26] pry(main)> Monads::Optional.new(Hashie::Mash.new({foo: 'bar',

```

spam: {egg: ‘rick’}})).spam.egg.value  
=\> “rick”

2015-08-07 10:41 GMT+02:00 Elia S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

[Previous page](https://www.ruby-forum.com/t/be-brave/242903.md?page=1)
