2017-12-25 22 views
1

Ich habe einige Zweideutigkeiten im Umgang mit Ausnahmen: Warum wurde mir empfohlen, nicht aus einem Dialogfeld zu werfen?Wie kann die Ausnahmebehandlung mit modalen Dialogen richtig gehandhabt werden?

Hier ist mein Versuch:

In wndproc etwas wie folgt aus:

case WM_COMMAND: 
     switch(LOWORD(wparam)){ 
      case IDD_ABOUT:{ 
       try{ 
        int ret = DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc); 
        if(ret == IDOK) 
         MessageBox(hwnd, "Dialog exited with IDOK.", "Notice",MB_OK | MB_ICONINFORMATION); 
        else 
         if(ret == IDCANCEL) 
          MessageBox(hwnd, "Dialog exited with IDCANCEL.", "Notice",MB_OK | MB_ICONINFORMATION); 
        else 
        if(ret == -1) 
         MessageBox(hwnd, "Dialog failed!", "Error",MB_OK | MB_ICONINFORMATION); 
       } 
       catch(char *pError){ 
        MessageBox(NULL,pError,"Error",MB_OK); 
       // EndDialog(hwnd, IDOK); 
       } 
       catch(...){ 
        MessageBox(NULL,"Something went wrong!","Error",MB_OK); 
       // EndDialog(hwnd, IDOK); 
       } 
      } 
     break; 
     case ID_EXIT: 
      DestroyWindow(hwnd); 
     break; 
    } 
    break; 

Und in meinem modalen Dialogprozedur ich, wenn sich defekte Eingang werfen, wenn die Taste Eingabe erhalten klicken:

// In AboutDlgProc: 

//... 
case IDOK: 
    GetInputFromEditBox; // creating buffer and reading text and blahblah 
    if(not_good_input) 
     throw "Bad input"; // 

Ich weiß, eine leistungsfähigere Handhabung zu verwenden ist, die Hierarchien zu verwenden und von std::exception zu erben ... Aber hier nur für die Praxis.

  • Ist das wie soll ich werfen? Oder sollte ich es anders machen? Soll die Zeilen oben kommentiert werden? // EndDialog(hwnd, IDOK);?

Vielen Dank.

+4

Ihr Code sieht gut aus. Es wurde Ihnen wahrscheinlich empfohlen, das Dialogfeld nicht zu überspringen, da Sie KEINE Ausnahmen von Ihrem Code zurück in den MS-Windows-Code, der Ihren wndproc aufgerufen hat, machen dürfen. Der MS-Windows-Code ist "C" und weiß nicht, was man mit C++ - Ausnahmen, Stackabwickeln usw. machen soll. –

+0

@RichardCritten: Danke. Würde es Ihnen etwas ausmachen, eine Antwort hinzuzufügen? – WonFeiHong

+0

@RichardCritten: Aber Richard ich denke ich werfe aus meiner Dialogbox Prozedur? 'werfen" schlechte Eingabe ";'? – WonFeiHong

Antwort

1

Zusätzlich zu Richards Kommentar über Stapelabwicklungen gibt es ein noch grundsätzlicheres Problem, dass DialogBox ein HWND erstellt und das übergeordnete Fenster deaktiviert. Wenn Sie eine Ausnahme werfen, wird das erstellte HWND nicht zerstört und das übergeordnete nicht wieder aktiviert werden.

+0

plus 1. Fügen Sie ein Beispiel hinzu. – WonFeiHong

Verwandte Themen