View Full Version : [C - newbie] gestione errori di sistema
Gandalf_BD
06-05-2005, 08:11
Ciao a tutti...
ho bisogno di un piccolo aiuto...
avrei bisogno di inserire una chiamata ad un errore di sistema in un certo punto del codice...
o meglio...
faccio una fopen e, se il file non viene trovato, vorrei che mi saltasse fuori un messaggio di errore...
ho sentito dire che è possibile farlo, con una funzione che dovrebbe chiamarsi error(), però non so in che libreria si trovi e, provando ad inserirla così com'è, il compilatore mi da questo errore -> too few parameters...
mi spiegate come si usa? :)
grazie
ilsensine
06-05-2005, 08:12
La funzione si chiama "perror", ed è dichiarata in stdio.
Fenomeno85
06-05-2005, 08:21
La funzione si chiama "perror", ed è dichiarata in stdio.
funziona bene ho notato solo su linux su windows mia
~§~ Sempre E Solo Lei ~§~
ilsensine
06-05-2005, 08:24
funziona bene ho notato solo su linux su windows mia
mmm presumo che ti sei perso qualche carattere scrivendo il messaggio :D
Vuoi dire che su win non funziona come ti aspetti, immagino? Potrebbe essere; c'è comunque una API di windows per avere informazioni sugli errori, non so se funziona anche con fopen (oltre che con CreateFile).
Gandalf_BD
06-05-2005, 08:24
La funzione si chiama "perror", ed è dichiarata in stdio.
grazie... e che parametri gli devo passare?
l'errore è sempre lo stesso o posso "decidere io" quale generare?
grazie 1000 :)
Fenomeno85
06-05-2005, 08:25
mmm presumo che ti sei perso qualche carattere scrivendo il messaggio :D
Vuoi dire che su win non funziona come ti aspetti, immagino? Potrebbe essere; c'è comunque una API di windows per avere informazioni sugli errori, non so se funziona anche con fopen (oltre che con CreateFile).
ma mi ha mozzato delle parti :muro:
su windows non funziona bene perror ;)
~§~ Sempre E Solo Lei ~§~
ilsensine
06-05-2005, 08:28
grazie... e che parametri gli devo passare?
l'errore è sempre lo stesso o posso "decidere io" quale generare?
grazie 1000 :)
Accetta una stringa, che è il prefisso da stampare. Ad es:
FILE *f = fopen(...);
if(!f) perror("fopen");
potrebbe stampare, in caso di errore di privilegi,
fopen: access denied
perror di per se è standard ansi; però come dice Fenomeno devi verificare se sia stata correttamente implementata sotto windows. L'alternativa mi sembra sia GetLastError, ma non so se funziona con fopen.
Fenomeno85
06-05-2005, 08:35
dai provo e vi posto i risultati ;)
~§~ Sempre E Solo Lei ~§~
Fenomeno85
06-05-2005, 08:46
perror con fopen funziona bene ... mi ricordavo male :stordita:
Con getlasterror torna errore 2 ma qui bisogna capire che evento significa
~§~ Sempre E Solo Lei ~§~
Gandalf_BD
06-05-2005, 08:56
Con getlasterror torna errore 2 ma qui bisogna capire che evento significa[/b]
ma getlasterror è sempre nella stdio.h?
Fenomeno85
06-05-2005, 10:11
è sotto windows.h
~§~ Sempre E Solo Lei ~§~
RaouL_BennetH
06-05-2005, 11:02
scusate l'OT, ma stavo morendo quando ho digitato fopen in google, come primo link mi ha restituito questo:
http://www.fondopensionefopen.it/
:asd: :rotfl:
Fenomeno85
06-05-2005, 12:03
scusate l'OT, ma stavo morendo quando ho digitato fopen in google, come primo link mi ha restituito questo:
http://www.fondopensionefopen.it/
:asd: :rotfl:
:asd: cmq i problemi se non erro era nella programmazione di rete :O
~§~ Sempre E Solo Lei ~§~
Ciao...
Evito di aprire una nuova discussione perche' il tema e' piu' o meno lo stesso...
Con perror viene stampato un messaggio di errore relativo al valore 'corrente' della variabile errno. Sapete se c'e' qualche funzione analoga per stampare un messaggio relativo ad un valore arbitrario che errno potrebbe aver assunto in precedenza?
Mi spiego meglio: supponiamo che io esegua diverse chiamate a funzione, e che in caso di errore di queste mi vada a salvare, dopo ogni chiamata, il valore assunto da errno. Utilizzando questi valori salvati, posso in qualche modo stampare i corrispondenti messaggi d'errore in "differita"? Oppure, c'e' modo di redirigere l'output di perror su una stringa invece che su file? Mi serve perche' l'applicazione che sto facendo deve andare a 'compilare' piu' di un file di log, e voglio di volta in volta decidere su quale di questi file scrivere l'output di perror senza redirigerlo in continuazione.
Grazie,
Gica
ilsensine
10-05-2005, 08:27
strerror di string.h (e la funzione thread-safe strerror_r, per i sistemi che la supportano)
Perfetto! Proprio quello che cercavo :)
Grazie mille,
Gica
Ho letto che la strerror() puo' produrre la stringa di errore nella lingua specificata attraverso la variabile d'ambiente LC_MESSAGES, ma non riesco a trovare quali sono i possibili valori che si possono assegnare a tale variabile :(
Qualcuno sa quali sono? Potrebbero essere gli stessi di LANG?
Ultima cosa: settando tale variabile in un processo, poi devo anche esportarla affinche' sia visibile ai figli del processo stesso?
Grazie,
Gica :cool:
Aggiornamento: se do il comando locale, vedo che tutte le variabili del tipo LC_QUALCOSA hanno un valore, anche LC_MESSAGES; se invece do il comando echo $LC_MESSAGES ottengo una stringa vuota. Perche'?
ilsensine
12-05-2005, 07:56
Non ti conviene modificare quelle variabili d'ambiente, non c'è motivo. Devi usare le impostazioni di sistema, non imporre le tue. Così se un turco eseguirà il tuo programma, si ritroverà automaticamente i messaggi in turco.
Se proprio vuoi, le variabili d'ambiente si gestiscono con getenv/putenv (ma solo nel namespace corrente, ovvero solo per il processo corrente).
Non ti conviene modificare quelle variabili d'ambiente, non c'è motivo. Devi usare le impostazioni di sistema, non imporre le tue. Così se un turco eseguirà il tuo programma, si ritroverà automaticamente i messaggi in turco.
Se proprio vuoi, le variabili d'ambiente si gestiscono con getenv/putenv (ma solo nel namespace corrente, ovvero solo per il processo corrente).
Si, su questo sono d'accordo... Solo che, come ho detto prima, apparentemente la variabile LC_MESSAGES non e' settata a nessun valore (stando a quanto prodotto da 'echo $LC_MESSAGES', mentre con il comando locale ottengo per la stessa variabile il valore "it_IT.UTF-8"). Percio' suppongo che i miei processi si ritrovino in esecuzione in un ambiente in cui tale variabile non e' settata appropriatamente, e quindi tutti i messaggi prodotti da strerror sono in inglese anziche' nella lingua locale. :doh:
ilsensine
12-05-2005, 11:23
Allora, innanzitutto servono due cose: in primis, l'applicazione deve chiamare
setlocale(LC_ALL, "")
(definita in locale.h) in modo da poter utilizzare le impostazioni definite dalle variabili d'ambiente (nota che se non hai LC_MESSAGES sul tuo sistema, forse hai LC_ALL). Qui la man page è poco chiara, senza chiamare setlocale le variabili d'ambiente non hanno effetto. Quindi, è necessario che il database con le traduzioni per le tue localizzazioni sia presente; ad es. per it_IT.UTF-8 deve esistere il file
/usr/share/locale/it_IT/LC_MESSAGES/libc.mo
oppure il file
/usr/share/locale/it/LC_MESSAGES/libc.mo
Questo file dovrebbe essere fornito dalla distribuzione, ma molte non lo forniscono (ad es. sulla mia Mandrake non c'è).
In sintesi: chiama setlocale(LC_ALL, "") all'inizio del tuo programma e vivi tranquillo. Se non c'è la traslazione, vuol dire che manca libc.mo e su questo non puoi farci molto.
OK! Funziona :), grazie!
Comunque non tutti i messaggi di errore sono localizzati in italiano: sarebbe proprio un bel lavoretto da fare nel tempo libero... ;)
Gica :cool:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.