try
{
object result = processClass.InvokeMethod("Create", methodArgs);
}
catch (Exception e)
{
// Here I was hoping to get an error code.
}
当我调用上面的WMI方法时,我应该得到Access Denied。在我的catch块中,我想确保引发的异常确实是Access Denied。有没有办法可以得到它的错误代码? Acceess Denied的Win32错误代码是5。 我不想搜索错误消息中的拒绝字符串或类似的东西。
由于
答案 0 :(得分:34)
尝试此操作以检查异常,并检查Win32Exception derived exception.
的内部异常catch (Exception e){
var w32ex = e as Win32Exception;
if(w32ex == null) {
w32ex = e.InnerException as Win32Exception;
}
if(w32ex != null) {
int code = w32ex.ErrorCode;
// do stuff
}
// do other stuff
}
在注释中,您确实需要查看实际抛出的异常才能理解您可以执行的操作,并且在这种情况下,特定的catch优先于捕获Exception。类似的东西:
catch (BlahBlahException ex){
// do stuff
}
另外System.Exception has a HRESULT
catch (Exception ex){
int code = ex.HResult;
}
然而,它只能从.net 4.5以上获得。
答案 1 :(得分:4)
您应该查看抛出异常的成员,尤其是.Message
和.InnerException
。
我还会看看InvokeMethod的文档是否会告诉你它是否会抛出一些比Exception更专业的Exception类 - 例如@Preet建议的Win32Exception。捕获并查看Exception基类可能不是特别有用。
答案 2 :(得分:3)
在Preet Sangha的解决方案的基础上,以下内容应安全地涵盖您使用可能存在多种内部异常的大型解决方案的情况。
try
{
object result = processClass.InvokeMethod("Create", methodArgs);
}
catch (Exception e)
{
// Here I was hoping to get an error code.
if (ExceptionContainsErrorCode(e, 10004))
{
// Execute desired actions
}
}
...
private bool ExceptionContainsErrorCode(Exception e, int ErrorCode)
{
Win32Exception winEx = e as Win32Exception;
if (winEx != null && ErrorCode == winEx.ErrorCode)
return true;
if (e.InnerException != null)
return ExceptionContainsErrorCode(e.InnerException, ErrorCode);
return false;
}
此代码已经过单元测试。
通过在自己的块中管理每个预期的异常类型,我不会太过关注异常处理时需要通过欣赏和实现良好实践。
答案 3 :(得分:1)
我建议您使用来自异常对象的Message Properte,如下面的代码
try
{
object result = processClass.InvokeMethod("Create", methodArgs);
}
catch (Exception e)
{
//use Console.Write(e.Message); from Console Application
//and use MessageBox.Show(e.Message); from WindowsForm and WPF Application
}
答案 4 :(得分:-1)
另一种方法是直接从异常类中获取错误代码。例如:
catch (Exception ex)
{
if (ex.InnerException is ServiceResponseException)
{
ServiceResponseException srex = ex.InnerException as ServiceResponseException;
string ErrorCode = srex.ErrorCode.ToString();
}
}