PDA

View Full Version : [Python] Problema con "raise" nel terminale


Heretic Curse
17-04-2013, 18:32
Per qualche strano motivo, quando con il terminale di Ubuntu scrivo qualcosa con una riga in cui appare raise, nel caso in cui il ciclo debba utilizzare quella riga, anziché riportarmi l'eccezione gestita da raise mi restituisce l'errore classico che il terminale restituirebbe automaticamente. Volevo sapere se è mai successo anche ad altri e come risolvere.
Chiaramente sono pressocché sicuro di non compiere errori di sintassi.

HoldenCaulfield1987
18-04-2013, 15:46
Posta il codice.

Heretic Curse
18-04-2013, 17:23
>>> def InputNumero():
x = input('Scrivi un numero: ')
if type(x) != type(4):
raise 'ErroreNumero', 'Devi inserire un intero!'
return x

HoldenCaulfield1987
18-04-2013, 17:49
Non ho capito la tua idea:
1) vuoi gestire l'inserimento di stringhe al posto di un intero? se è cosi input genera una eccezione se gli passi una stringa
2) vuoi controllare se il numero passato sia un intero e non un float?

Heretic Curse
18-04-2013, 19:06
Devo semplicemente controllare che attraverso input sia assegnato ad x un valore di tipo int, e null'altro. Ho fatto questa funzione giusto per capire il funzionamento di raise comunque, so che potrei usare try/except e quant'altro, ma vorrei comprendere come mai raise non fa ciò che voglio :(

The_ouroboros
18-04-2013, 19:24
aehm... raise solleva eccezioni che poi tu catturi...

Esempio:


class SiteError(Exception):
""" Site error Exception Class """
def __init__(self, value):
self.value = value

def __str__(self):
return repr(self.value)


....


def loadNewsRss(self, site):
"""Load the news. You have to specify the site."""
if site in self._siteConf:
self.feed = feedparser.parse(self._siteConf[site],
agent='RssRead/0.3 +http://rssread.ciscoland.eu/')
self._news = [self._fmt_news %
{"site": news.link.encode('utf-8'), "title": news.title.encode('utf-8')}
for news in self.feed.entries]
else:
raise SiteError('Site not present')

....

(altro file)


def test_add_site_twice(self):
self.rss += 'io', 'tu'
try:
self.rss += 'io', 'tu'
except (TypeError, feed.SiteError):
self.fail('Already present site exception thrown, expected')

wingman87
18-04-2013, 19:56
Provo a dire la mia, poi magari è una cavolata...
Tanto per cominciare, per testare l'istruzione raise non c'è bisogno di scrivere più di una riga:
raise <quelloCheVuoiSollevare>
In secondo luogo, il problema credo sia proprio il tuo codice perché raise si aspetta un'eccezione, quindi avresti dovuto scrivere, ad esempio:
raise Exception('ErroreNumero', 'Devi inserire un intero!')

HoldenCaulfield1987
18-04-2013, 20:29
Io ancora non ho capito questo "classico errore" (non ho neanche python 2 per provare).

Heretic Curse
18-04-2013, 22:01
Fermi tutti sono un idiota: in pratica io per testare raise inserivo delle lettere come valore di x, ad esempio 't' o 'h', ma senza le virgolette, e quindi venivano riconosciute come variabili indefinite, che ovviamente non sono un tipo di dato, e per questo non si azionava l'if e di conseguenza nemmeno il raise. Ora che ho messo le virgolette vengono riconosciute come stringhe e raise funziona correttamente.
Scusate se vi ho fatto perdere tempo per un errore talmente ridicolo :muro: