Newsgroup: it.comp.www.php
Titolo: xdebug: il backtrace non include i parametri delle funzioni

<?php // backtrace.txt
 
function trigger($x) {
     trigger_error('test');
}
 
function exception($x) {
     throw new \Exception('test');
}
 
trigger('pippo');
echo PHP_EOL;
exception('pluto');
 
?>
 
Dunque se si manda in esecuzione lo script tramite riga di comando:
 
php backtrace.php
 
si ottiene questo output:
 
PHP Notice:  test in backtrace.php on line 4
PHP Stack trace:
PHP   1. {main}() backtrace.php:0
PHP   2. trigger() backtrace.php:11
PHP   3. trigger_error() backtrace.php:4
 
PHP Fatal error:  Uncaught exception 'Exception' with message 'test' in 
backtrace.php:8
Stack trace:
#0 backtrace.php(13): exception('pluto')
#1 {main}  thrown in backtrace.php on line 8
 
 
Come si può notare, il primo backtrace riguarda il trigger, mentre il 
secondo riguarda l'eccezione.
 
Adesso, tralasciando i vari dettagli, prendiamo in considerazione 
soltanto queste righe:
 
PHP   3. trigger_error() backtrace.php:4
#0 backtrace.php(13): exception('pluto')
 
Si può notare che il parametro 'pippo' (relativo alla funzione 
trigger_error) non viene visualizzato, mentre il parametro 'pluto' 
invece si.
 
In pratica vorrei che invece di
 
trigger_error()
 
venga visualizzato
 
trigger_error('pippo')
 
E' possibile?
 
PS
 
Ecco la com'è configurata l'estensione xdebug (all'interno del file 
/opt/lampp/etc/php.ini):
 
[xdebug]
zend_extension=/opt/lampp/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so
xdebug.collect_params=4
 

 <snip>
 
ho fatto un po' fatica a capire e immaginare quello che volevi e alla fine ho
rinunciato :)
 
Che devi fare?
Perché non fai un throw e basta?
 
Ciao!

E' possibile?
 
Si', ma ti devi sbattere un po'.
 
Leonardo
 
-- 
A stultis ex omnibus gentium varie pictis
A sanctae fidei adeptis, ab eorum odore;
AB insanis Iacobinis, ab eorum ardore
AB idolatris et martyribus odii et terroris;
A paradisi fautoribus dicentibus "est pro amore",
A manichaeis ululantibus "Nisi nobiscum prodes";
LIBERA, libera, libera, libera nos, Domine.

 Perché non fai un throw e basta?
 
per fare debug di solito e meglio evitare i throw, infatti di solito si 
usa la funzione assert() che appunto genera un WARNIMG, che però non 
fornisce un backtrace dettagliato  (ma perchè?)  come vorrei
 


Cioè, fammi capire, dici che è meglio evitare le eccezioni perché fanno
esattamente fanno quello che ti serve?
:/
 
Ciao!

 fornisce un backtrace dettagliato  (ma perchè?)  come vorrei
 
Perché non hai capito a cosa serve assert.
 
Non serve per avere un backtrace, ma per verificare che in un certo punto 
una certa condizione sia verificata.
Per esempio:
 
function intSum($a, $b) {
 assert(is_int($a));
 assert(is_int($b));
 return $a + $b;
}
 
Puoi abilitarlo (quando fai test) o disabilitarlo (in produzione) senza 
dover modificare il codice.
 
Solitamente, piuttosto che usare assert, si fa unit testing. Non 
appesantisce il codice, è esterno, lo puoi lanciare in batch, ecc.
 
trigger_error e throw sono due cose ancora diverse.
 
Il primo serve a lanciare un errore, solitamente per bloccare tutto in 
caso di dati non coerenti (e non si usa quasi mai).
 
Il secondo per lanciare un errore intercettabile.
 
Bye.

 Il secondo per lanciare un errore intercettabile.
 
certamente
 

 :/
 
mi sto riferendo alla fase di debug, e non alla fase di produzione.
In fase di debug si usa (temporaneamente) assert in genere per fare 
verifiche intermedie...


 
Ma te, 'ste "regole di vita", dove l'hai prese? Se stai facendo debug e ti
serve di mettere per cinque minuti un'eccezione la metti, poi la levi. Come ha
detto Alessandro se ti serve di fare test usi dei test. Non è che ti picchia
nessuno se risolvi i problemi in maniera pulita e veloce, eh.
 
Ciao!

fma...@gmail.com
 ha scritto:

Assert mi sembrava piu pratico (senza scrivere if...throw
 blablabla...).
E poi finito il debug per fare pulizia basta trovare gli assert e
 rimuoverli. Throw invece non è proprio specifica per scopi di
 debug.
Comunque niente, ci si adegua ?
-- 
 
 
----Android NewsGroup Reader----
http://usenet.sinaapp.com/
 

 Ma te, 'ste "regole di vita", dove l'hai prese? Se stai facendo debug e ti
 
"
Le asserzioni dovrebbero essere utilizzate solo per il debug. Si
 possono usare per controlli di coerenza che sono sempre TRUE e
 che, in caso contrario, indichino errori di programmazione,
 oppure per verificare la presenza o meni di certe
 caratteristiche, tipo le estensioni, oppure certi limiti di
 sistema o caratteristiche."
Fonte: 
http://php.net/manual/it/function.assert.php
 (il sito che
 un po' tutti consigliate)


 
 
Allora.. assert viene dal C, dove è una macro definita sotto NDEBUG, per
cui la chiamata a funzione non viene proprio compilata in produzione.
PHP, specialmente agli inizi, scimmottava un sacco le funzioni della libc,
e quindi c'abbiamo anche assert - che però in PHP non c'ha molto senso.
 
Se devi metterla e poi levarla non vale né più né meno di qualsiasi altro
sistema che devi mettere e poi levare. A questo punto usi quello che fa
prima e meglio quello che ti serve.
 
Detto questo, anche in C (che è il mio linguaggio principale) non ho mai
messo un'assert in vita mia, visto che avere un comportamento diverso tra
codice di debug e codice in produzione significa lasciare la porta spalancata
verso una quantità di casini che ti puoi solo immaginare.
 
Ciao!

 verso una quantità di casini che ti puoi solo immaginare.
 
questa si che è una risposta costruttiva!!!
Le "regole di vita" proprio... sorvoliamo!!!

 Le "regole di vita" proprio... sorvoliamo!!!
 
Avere codice uguale in locale e in produzione mi sembra rientrare più nel 
buon senso.
 
Ciao!

 buon senso.
 
e ci mancherebbe.
Mi ha dato solo un po' di fastidio il moralismo ironico "regole di vita"

 Mi ha dato solo un po' di fastidio il moralismo ironico "regole di vita"
 
Non era moralisimo, era più...
 
La frase più adeguata secondo me è quella che disse Tarrasch sulla sua
famosa regola nei finali di scacchi: "la torre va sempre messa sotto il pedone
passato, eccetto quando farlo è sbagliato." :)
 
Ciao!