Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Exception - obsługa wyjątków.
Forum PHP.pl > Forum > Przedszkole
Fifi209
Od kilku dni próbuję pojąć "rzucanie" wyjątków.

W swoich klasach "rzucam" wyjątkami przy wystąpieniu błędów typu critical dla mojej aplikacji (czyli takie, które uniemożliwiają dalsze działanie aplikacji)

Powiedzmy, że wyjątki wydają mi się troszkę "nieporęczne" w użytku.

Mam przykładowo:
(piszę od ręki)

Kod
class layout {

// jakieś metody

function load($dir, $file) {

if (file_exists(/* argumenty)) {
// include
}else{
// rzucam wyjątkiem
throw new Exception('Nie mogę załadować pliku xxx.php');
}
}
}


I potem w innym pliku chcąc "złapać" wyjątek...

Kod
try {
$handle->load($plik);
} catch {
// obsługa błędu, czy to zapisanie loga czy wyświetlenie użytkownikowi informacji o błędzie
}


Według moich założeń, wyjątkami rzucałbym tylko przy błędach krytycznych, o których pisałem wyżej.
I tak jest ich sporo, a używanie wszędzie try { } catch { } jest co najmniej nie wygodne.

Macie jakieś swoje pomysły? Doświadczenia ? Co do łapania wyjątków i ich obsługi ?
erix
Generalnie, wyjątki stosuje się w sytuacjach, gdy błąd uniemożliwia dalsze działanie konkretnego kodu, np.:

  1. <?php
  2. try{
  3.  pobierzIdUsera(id);
  4.  
  5.  zmienMuImie(asdasd);
  6.  przeniesDoGrupy(sss);
  7. }catch(Exception $ex){
  8.  echo "Nie wykonałem operacji, bo użytkownik ".$ex->getMessage();
  9. }
  10. ?>

Jeśli np. użyszkodnik nie istnieje, to jak można by było mu imię zmienić, czy przenieść?

Cytat
I tak jest ich sporo, a używanie wszędzie try { } catch { } jest co najmniej nie wygodne.

To jest właśnie bolączka, że PHP zamiast pluć wyjątkami, to zwraca tylko false przy niepowodzeniach. W innych językach jest to bardziej ucywilizowana konstrukcja. winksmiley.jpg
Fifi209
Tzn. Wymyśliłem jedno rozwiązanie do "łapania" wyjątków.
Lecz trzeba by je dopracować. Może coś wymyślimy i będzie przełom? biggrin.gif

Mam jakąś klasę:

Kod
class nazwa1 {

// metody bez wyjatków

// a tu z wyjątkami
function wyjatek1() {
// operacje
}

function wyjatek2() {
// operacje
}
}


następnie tworzę nową klasę:

Kod
interface i_nazwa1 {
function wyjatek1();
function wyjatek2();
}

class wyjatki implements i_nazwa1 {

private $handle;

function __construct($handle) {
$this->handle = $handle;
}

function wyjatek1() {
try {
$handle->wyjatek1(); // wywoła funkcję wyjątek1 z klasy nazwa1
} catch (Exception $e) {
// tutaj zapisuję błąd $e->getMessage();
}
}

}


To rozwiązanie byłoby fajne, gdyby te metody były jakoś pogrupowane np. klasa mysql
(@edit właściwie to działa jak takie jądro)

$handle->mysql->funkcja

ale parser

$handle->parser->funkcja

Rozumiesz mnie ?

Bo jak na razie dostaję:

$handle->funkcja // mysql
$handle->funkcja2 // parser

W najlepszym przypadku zrobię sobie nazwy metod na zasadzie:
$handle->MysqlFunckja
$handle->ParserFunckja

Najlepiej jakbym miał
$handle->klasa->funkcja

;[

Jakieś pomysły ?
erix
  1. <?php
  2. $handle->wyjatek1(); // wywoła funkcję wyjątek1 z klasy nazwa1
  3. ?>

Nie wywoła. tongue.gif A this, to gdzie?

Cytat
Jakieś pomysły ?

Nie wiem, czy mamy to samo na myśli, ale przecież możesz tworzyć własne wyjątki...

  1. <?php
  2. class mysqlException extends exception{}
  3. class parserException extends exception{}
  4.  
  5. try{
  6.   methMysql();  // throw new mysqlException
  7.   methParser();  // throw new parserException
  8. }catch(mysqlException $mE){
  9.   echo $mE->getMessage();
  10. }catch(parserException $pE){
  11.   echo $pE->getMessage();
  12. }
  13. ?>


Nie trzeba niczego nowego wymyślać. tongue.gif
Fifi209
Chodzi mi o "ukrycie" try {} catch {} przy używaniu funkcji, które "rzucają" wyjątkami.

Czyli np. zamiast w index.php (gdzie muszę wczytać plik z nagłówkiem) pisać

try {
layout::load($file);
} catch (Exception $e) {
error::save($e);
}

wolałbym coś na wzór taki jak mam teraz:
layout::load($file)

Gdyż nie wyobrażam sobie pisać wszędzie gdzie "rzucam" wyjątkami tak pisać, jeszcze zapomnę i mam error ;d

Teraz do zapisuj błędu mam własną klasę error w pełni statyczną. Błędy podzielone na normalne (te które nie przeszkadzają przy wczytywaniu strony) i krytyczne (te które "zabijają" działanie skryptu).

@offtopic
Zrobili wyjątki, interfejsy nie dość, że jest to niedopracowane to... ehh... lepiej gdyby dali możliwość np. dziedziczenia z kilku klas wielu programistom ułatwiłoby to pracę.
erix
Cytat
Błędy podzielone na normalne (te które nie przeszkadzają przy wczytywaniu strony)

To robisz po prostu trigger_error" title="Zobacz w manualu PHP" target="_manual. winksmiley.jpg

Cytat
i krytyczne (te które "zabijają" działanie skryptu).

W uproszczeniu:
  1. <?php
  2. try{
  3.   require 'core.php';
  4.   app::boot();
  5. }catch(coreException $ex){
  6.   mail(... "coś nawaliło: ".$ex);
  7.   echo "poważny błąd aplikacji, admin już wie, co robić";
  8. }
  9. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.