c#在Try..Catch之后使用未分配的局部变量
我正在使用下面的代码获取MS Word的一个运行实例 我现在有一个关于“使用未分配的局部变量“oWord”的编译问题 这是我的密码:c#在Try..Catch之后使用未分配的局部变量,c#,.net,interop,C#,.net,Interop,我正在使用下面的代码获取MS Word的一个运行实例 我现在有一个关于“使用未分配的局部变量“oWord”的编译问题 这是我的密码: Microsoft.Office.Interop.Word._Application oWord ; try { // Is Word running? oWord = Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; // App
Microsoft.Office.Interop.Word._Application oWord ;
try
{
// Is Word running?
oWord = Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; // ApplicationClass;
}
catch (COMException ce)
{
if (ce.ErrorCode == unchecked((int)0x800401E3))
// No, Word not in ROT, start a new instance
oWord = new Microsoft.Office.Interop.Word.Application();
}
// Use instance referened by _WordApp
oWord.ScreenUpdating = false; // < PROBLEM HERE
object objDefaultBehaviorWord8 = WdDefaultTableBehavior.wdWord8TableBehavior;
object objAutoFitFixed = WdAutoFitBehavior.wdAutoFitFixed;
//MAKING THE APPLICATION VISIBLE
oWord.Visible = Properties.Settings.Default.DebugMode;
oWord.DisplayAlerts = WdAlertLevel.wdAlertsNone;
Microsoft.Office.Interop.Word.\u应用程序oWord;
尝试
{
//Word正在运行吗?
oWord=Marshal.GetActiveObject(“Word.Application”)作为Microsoft.Office.Interop.Word.Application;//ApplicationClass;
}
捕获(COMException ce)
{
如果(ce.ErrorCode==未选中((int)0x800401E3))
//不,字不在腐,开始一个新的实例
oWord=新的Microsoft.Office.Interop.Word.Application();
}
//使用由_WordApp引用的实例
oWord.ScreenUpdate=false;//<这里有问题
对象objDefaultBehaviorWord8=WdDefaultTableBehavior.wdWord8TableBehavior;
object objAutoFitFixed=WdAutoFitBehavior.wdAutoFitFixed;
//使应用程序可见
oWord.Visible=Properties.Settings.Default.DebugMode;
oWord.displayerts=WdAlertLevel.wdAlertsNone;
但在我看来,oWord是赋值的,我猜编译器正在查看我的Try..Catch块,并说我有未赋值的oWord
那么,正确的分配方法是什么呢?如果
封送.GetActiveObject
调用失败,可能永远不会分配它,但错误代码不是未选中((int)0x800401E3)
首次声明时,需要将oWord设置为:
Microsoft.Office.Interop.Word._Application oWord = null;
或
我可能会选择后者。这也消除了进一步进行空检查的需要,现在您确实应该进行空检查,因为如果try/catch块中捕获到异常,您还没有完全中止
(话虽如此,如果这样做实际上会在Word尚未运行时启动它,请使用第一个选项,然后确保在try/catch之后
oWord
不仍然为null。)如果Marshal.GetActiveObject
调用失败,则可能永远不会分配它,但错误代码不是未选中((int)0x800401E3)
首次声明时,需要将oWord设置为:
Microsoft.Office.Interop.Word._Application oWord = null;
或
我可能会选择后者。这也消除了进一步进行空检查的需要,现在您确实应该进行空检查,因为如果try/catch块中捕获到异常,您还没有完全中止
(话虽如此,如果这样做实际上会在Word尚未运行时启动它,请使用第一个选项,然后确保在try/catch之后,
oWord
不仍然为null。)只需为其指定一个默认值null
:
Microsoft.Office.Interop.Word._Application oWord = null;
这是必要的,因为代码当前在catch{}块的
if语句
中为其赋值,因此oWord
可能永远不会得到没有初始/默认值的值 只需为其分配一个默认值null
值:
Microsoft.Office.Interop.Word._Application oWord = null;
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
if (ce.ErrorCode == unchecked((int)0x800401E3))
oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
这是必要的,因为代码当前在catch{}块的if语句
中为其赋值,因此oWord
可能永远不会得到没有初始/默认值的值
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
if (ce.ErrorCode == unchecked((int)0x800401E3))
oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
让我们看看为什么编译器会告诉您,在执行此代码后,oWord
可能不会被赋值
try
中的代码毫无例外地执行,则必须分配oWord
COMException
,它将被捕获。如果错误代码为0x800401E31
,则分配oWord
0x800401E3
,则从不分配oWord
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
// oWord still not initialized ....
if (ce.ErrorCode == unchecked((int)0x800401E3))
oWord = new Microsoft.Office.Interop.Word.Application();
else
; // .... and still not initialized ....
}
oWord.ScreenUpdating = false;
在我看来,处理这个问题的最简单方法是重新抛出异常
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
if (ce.ErrorCode != unchecked((int)0x800401E3))
throw;
oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
这避免了需要将变量初始化为null
,然后测试它是否仍然为null
更重要的是,它显式地处理代码无法处理的错误条件。即除了MK_E_UNAVAILABLE
之外的COM错误
让我们看看为什么编译器会告诉您,在执行此代码后,oWord
可能不会被赋值
try
中的代码毫无例外地执行,则必须分配oWord
COMException
,它将被捕获。如果错误代码为0x800401E31
,则分配oWord
0x800401E3
,则从不分配oWord
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
// oWord still not initialized ....
if (ce.ErrorCode == unchecked((int)0x800401E3))
oWord = new Microsoft.Office.Interop.Word.Application();
else
; // .... and still not initialized ....
}
oWord.ScreenUpdating = false;
在我看来,处理这个问题的最简单方法是重新抛出异常
Microsoft.Office.Interop.Word._Application oWord;
try
{
oWord = Marshal.GetActiveObject("Word.Application") as
Microsoft.Office.Interop.Word.Application;
}
catch (COMException ce)
{
if (ce.ErrorCode != unchecked((int)0x800401E3))
throw;
oWord = new Microsoft.Office.Interop.Word.Application();
}
oWord.ScreenUpdating = false;
这避免了需要将变量初始化为null
,然后测试它是否仍然为null
更重要的是,它显式地处理代码无法处理的错误条件。即除了
MK_E_UNAVAILABLE
Microsoft.Office.Interop.Word.\u Application oWord=null
当if
计算为false时,if
有什么值?Microsoft.Office.Interop.Word.\u Application oWord=null
当if
计算结果为false?我认为这里的作用域不相关。问题只是局部变量可能没有赋值。我正在更改我的答案以表示if
语句。在我看来,@Anna也遗漏了处理除MK\u E\u UNAVAILABLE
之外的任何COM错误。初始化为null
只会导致编译时错误