Obsługa wyjątków w kontrolerze

0

Witam. Piszę aplikację z użyciem wzorca MVC oraz biblitoeki Qt i jestem ciekaw jak najefektywniej (towniej) stworzyć obsługę wyjątków w takiej aplikacji. Z moich prób i doświadczeń wynika że najlepiej byłoby umieścić blok try catch w kontrolerze (z którego w razie błędu mogę przesłać odpowiednie dane do np. widoku i wygenerować error). Przykładowy pseudokod:

class JakisController : public Controller {
private:
     Model * model;
     View * view;
public:
     JakisController() {
          //jakaś inicjalizacja
     }

     void action() {
           try {
                 model->loadFile('jakisplik');
           } catch (FileNotFoundException e) {
                  view->show_err();
           }
     }
};

Czy takie podejście jest poprawne? Pozdrawiam

1

W warstwie logiki obsluguj wyjatki i ew. opakowuj je we wrappery i wyrzucaj do prezentacji.

0

Logika to chyba model. W modelu średnio mogę przechwytywać wyjątki - model nie ma dostępu do widoku (zgodnie z zasadami MVC). Mógłbym złapać ten wyjątek a potem go jakoś przekazać kontrolerowi ale jest to trochę wywarzanie otwartych drzwi. W metodzie, którą pokazałem nie widzę jakiś większych problemów z czymkolwiek. Równie dobrze mogę zrobić obsługę większości wyjątków tylko w głównym kontrolerze (w subkontrolerach już nie) i kod nie straci na przejrzystości. Chyba że nie zrozumiałem Twojego posta. Idei wrapperów jeszcze nie mam rozkminionej.

1

Kontroler to ma byc tylko posrednik miedzy widokiem, a modelem. Ma wywolac cos w modelu, zazwyczaj jakis serwis i wypluc widok wraz z danymi z wynikiu wywolania serwisu, ew. jakis redirect. Nic wiecej. Po prostu im glupszy jest kontroler, tym latwiej bedzie zmieniac ta prezentacje, jak na przyklad sobie zazyczysz miec interfejs konsolowy, czy webowy do aplikacji to bedzie to chwila robota. Stad tez kontroler nie powinien wiedziec o tym jak obsluzyc wyjatki wystepujace w logice, bo to nie jego sprawa. Natomiast normalnym podejsciem jest obsluzenie wyjatku w logice, zapakowanie jakichs danych do nowego, wlasnego wyjatku i wyrzucenie go z logiki do kontrolera, a potem kontroler wypluwa jakis widok, ktory sobie cos tam wyswietla, np. "ty %!@#$ nie hakjeruj mi aplikacji".

0

Hehe, ok, teraz rozumiem. Załóżmy że złapię jakiś własny wyjątek, np. FileNotFoundException. Teraz jak mam go przekazać do kontrolera (zwrócić), skoro w kontrolerze wywołuję jedynie metody danego modelu, które np. zwracają int, bool albo nic nie zwracają? W Qt jest mechanizm sygnałów i slotów no ale mówimy tu o uniwersalnej sytuacji.

0

Tak samo go zlapac try..catch

0

Aha, czyli mówisz o czymś takim?

Pseudokod:

//Moje wyjątki
class Exception {
public:
       virtual QString getMessage();
}

class MyException : public Exception 
{
private: 
        QString message;
public:
        virtual QString getMessage();
}


//w kontrolerze
void akcja() {
    try {
         model->loadFile('file');
    } catch(Exception e) {
         view->err(e.getMessage());
    }
}

//w modelu
void load(QString filename) {
    try {
          //gdzieś tam rzuca throw MyException
    } catch(MyException e) {
           throw e;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1