2010-12-17 6 views
12

El estándar std::exception::what() de C++ devuelve una cadena de caracteres angosta. Por lo tanto, si quiero poner un mensaje de cadena de caracteres amplia allí, no puedo.¿Existe un patrón típico para manejar cadenas de caracteres anchos en excepciones?

¿Hay una manera común/patrón/biblioteca de/para evitar esto?

EDITAR: Para que quede claro, podría simplemente escribir mi propia clase de excepción y heredar de ella, pero tengo curiosidad si hay una implementación más o menos estándar de esto. boost::exception parece hacer la mayor parte de lo que estaba pensando ...

+0

Iba a sugerir que se vuelva a codificar la cadena como UTF8, pero dada la situación en la que se usaría, ¡me alegro de no haberlo hecho! – dreamlax

+0

Avíseme si lo descubre. Estoy enfrentando el mismo problema. En teoría, se podría crear una nueva clase base para las excepciones, pero eso hace que todos los fines de captura sean realmente complicados. Tal vez una nueva clase de wexception: public std :: exception, y hacer la magia dentro, pero me temo que podría volverse muy ineficiente. –

+0

Posiblemente relacionado: [Excepciones con Unicode what()] (http://stackoverflow.com/questions/3760731) –

Respuesta

5

Sobre la base de este post Exceptions with Unicode what(), decidí hacer algo como esto:

class uexception : public std::exception { 
public: 
    uexception(LPCTSTR lpszMessage) 
     : std::exception(TCharToUtf8(lpszMessage)) { } 
}; 

todas partes en mi base de código, estoy asumiendo que .what() devolverá una cadena que está codificado en UTF-8. Mis rutinas de conversión de UTF-8 a TCHAR omitirán las secuencias UTF-8 no reconocidas y las reemplazarán por?. De esta manera, si .what() devuelve algo que no es válido UTF-8, no será un error épico.

El código no se ha compilado (más tarde hoy - ¡hay que arreglar algunas otras cosas primero! :). También me disculpo por los isótopos de MFC, pero creo que el mensaje se transmite de todos modos.

+0

¿Utilizaría un personaje distinto de? - De esa manera conduce a la vulnerabilidad masiva de vulnerabilidad de seguridad. Pero +1 para una respuesta útil. –

+0

Si desea hacerlo exactamente, use U + FFFD, el [carácter de reemplazo Unicode] (http://www.unicode.org/charts/PDF/UFFF0.pdf) (un blanco? En un diamante negro) que se "usa para reemplazar un carácter entrante cuyo valor es desconocido o no se puede representar en Unicode". –

+0

En realidad estoy usando el personaje de reemplazo. (Simplemente lo marcó :) –

2

Bueno, en Qt usted obtiene QString para cadenas, y esa cadena siempre está en Unicode. No es que hay que ir por Qt por el simple hecho de excepciones, pero aún así :)

+0

......... útil –

+0

Bueno, Billy pidió una biblioteca :) – Septagram

+0

Bueno, Estoy usando 'std :: wstring' ... Ya tengo una cadena en Unicode. ¿Qué tiene eso que ver con las excepciones? –

3

Usted puede poner cualquier cosa allí, pero si el código de terceros espera una const char* de what(), debe devolver const char* de ella.

Para su código, solo derive de std::exception y agregue el método const wchar_t* wwhat().

+0

a veces las respuestas simples son simplemente tan buenas :) –

Cuestiones relacionadas