c# - office - Coger el código de error específico de COMException
microsoft interop c# (3)
De hecho, logré que funcionara en el sistema que necesitaba y descubrí que el código de error era -2146807284.
Mirando eso, si convierto el 0x800A03EC a Binary, luego lo trato como cumplido de 2, entonces puedes calcular el valor.
Espero que alguien pueda ayudarme. Tengo una excepción específica de COM que debo capturar y luego intentar hacer otra cosa, todos los demás deben ignorarse. Mi mensaje de error con la excepción es:
System.Runtime.InteropServices.COMException (0x800A03EC): Microsoft Office Excel no puede acceder al archivo ''C: / test.xls''. Hay varias razones posibles:
Así que mi primer intento fue
try
{
// something
}
catch (COMException ce)
{
if (ce.ErrorCode == 0x800A03EC)
{
// try something else
}
}
Sin embargo, luego leí una advertencia del compilador:
Advertencia 22 La comparación con la constante integral es inútil; la constante está fuera del rango de tipo ''int'' ..... ExcelReader.cs 629 21
Ahora sé que el 0x800A03EC es el HResult y acabo de mirar en MSDN y leer:
HRESULT es un valor de 32 bits, dividido en tres campos diferentes: un código de gravedad, un código de instalación y un código de error. El código de gravedad indica si el valor de retorno representa información, advertencia o error. El código de instalación identifica el área del sistema responsable del error.
Entonces, mi última pregunta es ¿cómo me aseguro de atrapar esa excepción específica? ¿O cómo obtengo el código de error de HResult?
Gracias por adelantado.
El ErrorCode debe ser un entero sin signo; Puede realizar la comparación de la siguiente manera:
try {
// something
} catch (COMException ce) {
if ((uint)ce.ErrorCode == 0x800A03EC) {
// try something else
}
}
Un valor HRESULT tiene 32 bits divididos en tres campos: un código de gravedad, un código de instalación y un código de error. El código de gravedad indica si el valor de retorno representa información, advertencia o error. El código de instalación identifica el área del sistema responsable del error. El código de error es un número único que se asigna para representar la excepción. Cada excepción se asigna a un HRESULT distinto. Extracto de: http://en.wikipedia.org/wiki/HRESULT
De lo que recojo, la primera mitad de los bits HRESULT puede cambiar dependiendo del sistema / proceso que causa la excepción. La segunda mitad contiene el tipo de error.
El código debería verse como:
try {
// something
} catch (COMException ce) {
if ((uint)ce.ErrorCode & 0x0000FFFF == 0x800A03EC) {
// try something else
}
}
NOTA: tenga en cuenta que no soy un tipo .NET, por lo que debe cansarse de los errores de sintaxis en el código anterior.