Forum: Italian Ruby user group rescue warning

Posted by Alfonso Caponi (al_)
on 2009-12-30 16:33
Salve forum,

è possibile creare un'eccezione per un warning? Cerco di spiegarmi
meglio: utilizzo un modulo che in alcuni casi rari e particolari
(diciamo non RFC compliant) mi blocca l'esecuzione di uno script
restituendo:

# ./lib/modulo/mod.rb:123: warning: etc. etc.

Ho provato invano ad utilizzare qualcosa come "rescue warning", ma a
quanto pare rescue si utilizza solo per sollevare eccezioni riguardanti
gli errori.

Non avendo la possibilità di modificare il modulo, come potrei fare? So
che la mia richiesta è un po' generica, ma se avete qualche suggerimento
ve ne sarei grato.

Colgo l'occasione per farvi gli Auguri di un Felice Anno nuovo!
Posted by Luca Mearelli (Guest)
on 2009-12-30 16:40
(Received via mailing list)
2009/12/30 Alfonso Caponi <alfonso.caponi@gmail.com>:
> Salve forum,
>
> è possibile creare un'eccezione per un warning? Cerco di spiegarmi
> meglio: utilizzo un modulo che in alcuni casi rari e particolari
> (diciamo non RFC compliant) mi blocca l'esecuzione di uno script
> restituendo:
...
> Non avendo la possibilità di modificare il modulo, come potrei fare? So
> che la mia richiesta è un po' generica, ma se avete qualche suggerimento
> ve ne sarei grato.

Che modulo e'? Puoi fare un esempio concreto?

ciao,
Luca
Posted by Alfonso Caponi (al_)
on 2009-12-30 16:59
Luca Mearelli wrote:
> 2009/12/30 Alfonso Caponi <alfonso.caponi@gmail.com>:
>> Salve forum,
>>
>> � possibile creare un'eccezione per un warning? Cerco di spiegarmi
>> meglio: utilizzo un modulo che in alcuni casi rari e particolari
>> (diciamo non RFC compliant) mi blocca l'esecuzione di uno script
>> restituendo:
> ...
>> Non avendo la possibilit� di modificare il modulo, come potrei fare? So
>> che la mia richiesta � un po' generica, ma se avete qualche suggerimento
>> ve ne sarei grato.
> 
> Che modulo e'? Puoi fare un esempio concreto?
> 
> ciao,
> Luca

Il modulo è "snmp" (http://snmplib.rubyforge.org/). Il warning appare 
nel momento in cui si faccia una richiesta 'walk' verso alcuni apparati 
di rete che non implementano 'get-next' nel modo corretto/o standard.

snmp.walk(["1.3.6.1.2.1.25.4.2.1.2"]) do |name|
 ...
end

Non ho un sistema con IP pubblico da farvi provare. A prescindere 
dall'SNMP ecc. non vi viene in mente qualche workaround? :) Per quel 
poco che conosco di Ruby, pensavo all'utilizzo di un'eccezione :(

Grazie
Posted by Paolo Montrasio (pmontrasio)
on 2009-12-31 10:31
Alfonso Caponi wrote:
> Salve forum,
> 
> è possibile creare un'eccezione per un warning? Cerco di spiegarmi
> meglio: utilizzo un modulo che in alcuni casi rari e particolari
> (diciamo non RFC compliant) mi blocca l'esecuzione di uno script
> restituendo:
> 
> # ./lib/modulo/mod.rb:123: warning: etc. etc.

Se è un messaggio su standard output o standard error mi sa che quel che 
devi fare è ridirigerlo in una pipe verso un programma che in risposta 
ai warning ti generi le eccezioni che poi gestirai. Non so quanto sia 
compatibile con l'architettura generale del tuo sistema, ma è un'idea.
Quel modulo è closed source e non si può proprio toccare?

> Ho provato invano ad utilizzare qualcosa come "rescue warning", ma a
> quanto pare rescue si utilizza solo per sollevare eccezioni riguardanti
> gli errori.

Cos'è rescue warning?

> Non avendo la possibilità di modificare il modulo, come potrei fare? So
> che la mia richiesta è un po' generica, ma se avete qualche suggerimento
> ve ne sarei grato.
> 
> Colgo l'occasione per farvi gli Auguri di un Felice Anno nuovo!

Grazie e buon 2010 anche a te!

Paolo
Posted by Alfonso Caponi (al_)
on 2010-01-03 00:20
> Se è un messaggio su standard output o standard error mi sa che quel che 
> devi fare è ridirigerlo in una pipe verso un programma che in risposta 
> ai warning ti generi le eccezioni che poi gestirai. Non so quanto sia 
> compatibile con l'architettura generale del tuo sistema, ma è un'idea.
> Quel modulo è closed source e non si può proprio toccare?
Il problema di utilizzare una pipe è che il mio script è parte di un 
programma più grande, che lo "ingloba" come se fosse un modulo. Capisco 
anche che senza mostrare il mio codice risulta difficile identificare il 
mio problema.
Il modulo è opensource, ma visto che viene utilizzato da altri script 
preferivo non modificarlo.

> Cos'è rescue warning?
Avendo poca esperienza con Ruby e con la programmazione in generale, sto 
provando di tutto, cercando di poter gestire un'eccezione per un 
warning. Fanta-programmazione :)
Posted by gabriele renzi (Guest)
on 2010-01-03 12:10
(Received via mailing list)
2010/1/3 Alfonso Caponi <alfonso.caponi@gmail.com>:

> Il modulo è opensource, ma visto che viene utilizzato da altri script
> preferivo non modificarlo.

puoi modificarlo nel tuo singolo programma facendo monkey patching,
cioè ridefinendo quel pezzetto.

Se il warning ad esempio ti viene da un metodo #foo() nella class Bar
del modulo Baz puoi ridefinirlo e cambiarlo nel tuo codice con

require 'snmp'

# questo ridefinisce il metoto Baz::Bar#foo in questo script
module Baz
 class Bar
  def foo()
    #copincolla il codice originale e cambia quel che serve
  end
 end
end

è una zozzeria ma se la libreria non è abbastanza modulare da
lasciartelo fare in un modo più raffinato dovrebbe funzionare.

>> Cos'è rescue warning?
> Avendo poca esperienza con Ruby e con la programmazione in generale, sto
> provando di tutto, cercando di poter gestire un'eccezione per un
> warning. Fanta-programmazione :)

non troppo, in smalltalk (e in perl6 e in common lisp, IIRC) puoi
davvero trattare i warning come exception
http://en.wikipedia.org/wiki/GNU_Smalltalk#Exceptions

purtroppo in ruby no :)
Posted by Paolo Montrasio (pmontrasio)
on 2010-01-04 09:48
gabriele renzi wrote:
> non troppo, in smalltalk (e in perl6 e in common lisp, IIRC) puoi
> davvero trattare i warning come exception
> http://en.wikipedia.org/wiki/GNU_Smalltalk#Exceptions
> 
> purtroppo in ruby no :)

Da quel che ho letto ho capito, magari sbagliando, che un warning 
smalltalk sia un particolare tipo di eccezione che una volta sollevata 
mostra il messaggio a lei associato. Non vedo difficoltà a fare in ruby 
la stessa cosa, creando una classe Warning che derivi da Exception e che 
faccia la puts del messaggio nell'initialize, ma è possibile che ci 
siano dettagli dei warning smalltalk che mi sfuggono.

Limitandoci a risolvere il problema di Alfonso, la strada che suggerisci 
mi pare buona perché basterebbe fare il raise dell'eccezione subito dopo 
la puts del messaggio.

Paolo
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.