Visualizzazione dei risultati da 1 a 6 su 6

Discussione: try-catch in un ciclo

  1. #1

    try-catch in un ciclo

    Salve

    Ho un ciclo for in cui eseguo diverse istruzioni all'interno, del tipo

    Codice PHP:
    for (..) {
    //istruzione 1
    //istruzione 2
    //istruzione 3

    e ogni istruzione dovrebbe essere controllata. Io farei in questo modo:

    Codice PHP:
    for (..) {
    try {
      if (! 
    istruzione 1)
        throw new 
    Exception ("errore")
    }
    catch (
    Exception $e) {$e->getMessage();};

    try {
      if (! 
    istruzione 2)
        throw new 
    Exception ("errore")
    }
    catch (
    Exception $e) {$e->getMessage();};

    try {
      if (! 
    istruzione 3)
        throw new 
    Exception ("errore")
    }
    catch (
    Exception $e) {$e->getMessage();};

    La cosa mi convince poco però, perchè vorrei lanciare tre eccezioni diverse soprattutto nel messaggio di errore in output.
    Avete qualche suggerimento? :master:

  2. #2
    Puoi usare un solo costrutto try .. catch per tutte le eccezioni e sollevare una eccezione diversa (o l'eccezione base con un messagio diverso) per ogni "evento" (condizione if nel tuo caso).

  3. #3
    Ottimo, ma alla fine dovrò catturare tutte le eccezioni? O meglio, un catch per ogni eccezione da me sollevata?

  4. #4
    Se usi eccezioni (classi) diverse puoi usare un catch per ognuna di queste oppure uno unico per tutto. Se cambi solo il messaggio, devi utilizzare un solo catch.

    In entrambi i casi, se il tuo obiettivo e' solo quello di visualizzare un messaggio diverso, e' piu' semplice usare un unico catch (codice piu' corto).

  5. #5
    secondo me ti conviene crearti 3 eccezioni, estendendo la classe Exception, e poi usare con il throw queste in modo da gestirle correttamente con il catch

    per farti un esempio
    Codice PHP:
    for (..)
    {
      try
      {
        if (!
    istruzione1)
          throw new 
    MyFirstException ()

        if (!
    istruzione2)
          throw new 
    MySecondException ()

        if (!
    istruzione3)
          throw new 
    MyThirdException()
      }
      catch (
    MyFirstException $e)
      {
        
    $e->getMessage();
      }
      catch (
    MySecondException $e)
      {
        
    $e->getMessage();
      }
      catch (
    MyThirdException $e)
      {
        
    $e->getMessage();
      }

    quello che però ti consiglio e di evitare di farne un uso di questo tipo perché le eccezioni rallentano cosistentemente l'esecuzione del codice quindi conviene usarle per quello che serve ovvero una gestione centralizzata degli errori ovvero devono essere direttamente le funzioni/metodi a lanciare l'eccezione in modo da inserire informazioni utili e in modo da poter leggere lo stacktrace per analizzare lo "storico" della chiamata

    di solito, quando uso le eccezioni, uso i try catch innestati, ovvero metto un try/catch contenente praticamente tutto il codice in modo da gestire eccezioni non correttamente dal resto del codice cosi gli errori li visualizzo per come dico io, dopo di che aggancio all'error handler una funzione per far lanciare le eccezioni, in modo che i notice ed i warning vengano gestiti dal sistema base ... ovviamente però il codice va ad effettuare dei controlli specifici ... nel senso che se per esempio mysql_connect lancia un warning io non lo faccio arrivare perché metto la chiocciola e gestisco l'errore che mi ha appena ritornato in autonomia nella classe stessa

    in questo modo hai un dettaglio degli errori elevatissimo ed anche una gestione molto flessibile e centralizzata

    Comunque io il codice lo vedrei più qualcosa tipo
    Codice PHP:
    for (..)
    {
      try
      {
        
    istruzione1
        istruzione2
        istruzione3
      
    }
      catch (
    MyFirstException $e)
      {
        
    $e->getMessage();
      }
      catch (
    MySecondException $e)
      {
        
    $e->getMessage();
      }
      catch (
    MyThirdException $e)
      {
        
    $e->getMessage();
      }

    dove istruzione1, istruzione2 ed istruzione3 sono specifici metodi/funzioni che eseguono N operazioni e lanciano le dovute eccezioni

  6. #6
    Perfetto, mi avete dato degli spunti interessanti. Avevo infatti il dubbio che creare continuamente nuove eccezioni rallentasse tutto il sistema.
    Ringrazio per le info!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.