1

J'ai une classe CExceptionHandler appelée lorsque mon application détecte une exception d'exécution. Par exemple:Déchargement de données utiles pour la console sur exception interceptée

if (val == NULL) 
{ 
    TRACE(_T("Unexpected NULL in sequence.")); 
    AfxThrowException(ERROR_INVALID_DATA); 
} 

AfxThrowException est très simple:

void AfxThrowException(DWORD error) 
{ 
    CExceptionHandler * pException = NULL; 

    if (error == 0) 
    { 
     error = ::GetLastError(); 
    } 

    pException = new CExceptionHandler(error); 

    TRACE(_T("Warning: throwing CSerialException for error %d\n"), error); 
    THROW(pException); 
} 

Ceci est la fonction membre Dump de CExceptionHandler:

void CExceptionHandler::Dump(CDumpContext & dc) const 
{ 
    CObject::Dump(dc); 

    dc << "m_dwError = " << m_dwError; 
} 

plus haut dans mon code que j'ai les déclarations try/catch :

try 
{ 
    /* My app does stuff where the exception is thrown. */ 
} 
catch(CExceptionHandler * ex) 
{ 
    afxDump << _T("Dumping exceptional data: ") << _T("\r\n"); 
    ex->Dump(afxDump); 
    afxDump << _T("\r\n"); 
} 

Je voudrais que les informations de débogage collectées soient sauvegardées dans la console. Cependant, lorsque le PC entre dans l'instruction catch (vérifiée avec le point d'arrêt), rien ne se passe sur la console. J'utilise Visual Studio 2008 en mode débogage. Les pensées sont appréciées. Merci.

+0

Y at-il un résultat que vous lancez mémoire allouée dynamiquement? (Leaky.) – GManNickG

+1

@GMan: Y at-il un résultat que vous utilisez "raison" au lieu de "résultat"? ':)' (Oh, et je pense que c'est MFC pour vous.Mais mon opinion sur la question est seulement de ouï-dire ...) – sbi

+0

@sbi: Ha, bon. – GManNickG

Répondre

3

CDumpContext envoie la sortie au débogueur, et non à la console (voir OutputDebugString pour plus d'informations), et si vous exécutez sous le débogueur Visual Studio, la sortie apparaît dans la fenêtre de sortie .

Si vous voulez envoyer également à la console, vous pouvez configurer CDumpContext d'écrire à un CFile en passant un pointeur vers un objet CFile dans le CDumpContext constructor.

Si votre application est construite avec le « utilisation de caractères multi-octets » option de configuration, vous pouvez utiliser CStdioFile pour écrire soit stdout ou stderr:

CStdioFile file(stdout); 
CDumpContext dumpContext(&file); 
ex->Dump(dumpContext); 

Ou, si vous voulez utiliser afxDump, vous pouvez définir sa variable membre m_pFile directement (elle est déclarée public). Par exemple, vous pouvez mettre ce code dans votre fonction main:

CStdioFile file(stdout); 
afxDump.m_pFile = &file;  

Mais, cela ne fonctionnera pas si votre application est construit comme Unicode parce que les chaînes doivent être converties en multi-octets à écrire sur la sortie standard. Pour ce faire, la conversion, écrire une classe qui hérite CFile:

class CDumpFile : public CFile 
{ 
    public: 
     virtual void Write(const void* lpBuf, UINT nCount); 
}; 

void CDumpFile::Write(const void* lpBuf, UINT nCount) 
{ 
    // Construct string from array of wide chars 
    const wchar_t* p = static_cast<const wchar_t*>(lpBuf); 
    UINT len = nCount/sizeof(wchar_t); 
    CStringW str(p, len); 

    CStringA astr(str); // Convert wide char to multibyte 

    fputs((LPCSTR)astr, stdout); // Write multibyte string to stdout 
} 

et l'utiliser comme ceci:

CDumpFile file; 
afxDump.m_pFile = &file; 

Un couple d'autres points sur votre code:

  1. Vous devriez assurez-vous que l'objet d'exception est supprimé dans le bloc catch. Si votre classe CExceptionHandler hérite du CException du MFC, vous devez appeler le ex->Delete(). Si ce n'est pas le cas, vous devez delete ex.

  2. Je déconseille d'utiliser le préfixe Afx pour les fonctions propres - vous devriez considérer cela réservé à l'utilisation par la bibliothèque MFC, à mon avis.

J'espère que cela aide!

+0

Merci! J'ai implémenté la solution en utilisant 'CDumpContext dumpContext (& fichier)', et cela fonctionne pour la plupart. Cependant, c'est espacer les caractères ('une xception CE H andlerat $ 0 0 E 2 4 E 4 0 m _ dw E rrrrrrr = 1 7 0.) Des pensées sur ce qui cause cela? –

+0

Oui, c'est parce que' CStdioFile' est en train d'écrire des chaînes 'wchar_t' sur la console, qui attend MBCS.Voir ma mise à jour – ChrisN

+0

Cela semble fonctionner maintenant Merci pour l'aide! –

Questions connexes