Posso eseguire una query in un blocco catch di try-catch? [duplicare]

0

Voglio confermare il giusto approccio all'uso del gestore delle eccezioni try-catch.

Ho scritto una query in un blocco try e, se viene lanciata un'eccezione, eseguirà una query in un blocco catch.

È questa la strada giusta?

try {
    $query->fieldOrderBy($column_name, 'value', $sv1);
} catch (Exception $ex) {
    if (!empty($ex)) {
        $for_boolean = explode('boolean_', $column_name);
        $query->fieldOrderBy($for_boolean[1], 'value', $sv1);
    }
    
posta Sugandh Khanna 20.10.2015 - 10:33
fonte

1 risposta

1

Can I execute a query in a catch block of try-catch?

Puoi fare (praticamente) tutto ciò che vuoi in un blocco catch . C'è un po 'di ambiguità quando return in catch / finally , ma questo non è il caso qui.

Is this the right way?

Dipende da cosa stai cercando di ottenere. Se quando si studiano le regole aziendali ha senso eseguire una determinata query del database quando qualcosa va storto in un caso specifico, allora sì, questo è il modo giusto. Ad esempio, si potrebbe immaginare un caso in cui un elemento viene aggiunto a un database e se non riesce a causa di un vincolo univoco, prova ad aggiungere lo stesso elemento dopo aver modificato il valore problematico.

Nel tuo caso, potrebbe essere sensato ordinare alcuni dati da qualcosa, se fallisce, ordinare da qualcos'altro, e se fallisce ancora, propagare l'eccezione in cima allo stack. Senza alcuna informazione sul dominio, non siamo in grado di indovinare se il tuo approccio è giusto o sbagliato.

Il tuo codice, d'altra parte, sembra problematico.

  1. Dato il nome di $query->fieldOrderBy , mi aspetto che restituisca qualcosa: o gli articoli ordinati, o il numero di righe interessate. Non usi / controlli il valore di ritorno. Perché?

  2. Che cos'è $sv1 ? È in realtà il nome più esplicito che potresti dare alla variabile in un contesto del tuo dominio aziendale?

  3. Perché catch (Exception $ex) invece di catturare un tipo più specifico di eccezione?

  4. Perché if (!empty($ex)) ? Cosa stai cercando di ottenere? Quale sarebbe il caso in cui verrà eseguito il blocco catch , ma la condizione risulterà in false ?

  5. In $for_boolean = explode('boolean_', $column_name); , cosa succede se il nome della colonna non contiene boolean_ ?

  6. Prima di fare $for_boolean[1] , non controlli di avere almeno due elementi.

  7. Se hai a che fare con un database SQL, non dovresti specificare i nomi delle colonne nelle variabili: ciò comporterà query calcolate, che alla fine porteranno a SQL Injection (e scarse prestazioni).

risposta data 20.10.2015 - 11:00
fonte

Leggi altre domande sui tag