声明变量以在try块之外使用的正确方法

时间:2015-01-21 18:04:58

标签: c# visual-studio-2010 error-handling

所以我对C#相当新(一般不编程),我编写了一些几乎零错误处理的代码,以便在VS中运行概念证明。现在我准备在应用程序中构建一些错误处理,以便可以部署应用程序。所以现在我在确定如何/在何处声明变量时遇到问题,以便我可以正确配置Try Catch块。

因此,对于原始类型,我只是在块

之外创建变量

在:

String TheString = "Some times I break";
SomeFunctionThatBreaks(TheString);

SomeFunctionThatDoesntBreak(TheString);

后:

String TheString ="";
Try
{
TheString="Some Times I break";
SomeFunctionThatBreaks(TheString);
}
Catch
{
MessageBox.Show("Error")
return false;
}
SomeFunctionThatDoesntBreak(TheString);

但是对于像FileStream这样的复杂类型,我不确定创建EMPTY变量以供以后使用的正确方法:

之前:

        FileStream SourceFile = File.OpenRead(TheFile);
        StreamReader sr ; = new StreamReader(SourceFile);            
            char[] block = new char[3];
            byte[] header = new byte[6];
            SourceFile.Read(header, 0, 6);
            SourceFile.Seek(0, 0);
            encoding = (header[1] == 0 && header[3] == 0 && header[5] == 0) ? Encoding.Unicode : Encoding.UTF8;
            sr.ReadBlock(block, 0, 3);
            String sBlock = new String(block);
            SourceFile.Seek(0, 0);
    if(sBlock=="ABC")
    {
MyFunction(SourceFile);
    }

导致编译错误:

    FileStream SourceFile ;
    String sBlock ="";
    Encoding encoding;
    StreamReader sr;

    try
    {
        SourceFile = File.OpenRead(TheFile);
        sr = new StreamReader(SourceFile);
        char[] block = new char[3];
        byte[] header = new byte[6];
        SourceFile.Read(header, 0, 6);
        SourceFile.Seek(0, 0);
        encoding = (header[1] == 0 && header[3] == 0 && header[5] == 0) ? Encoding.Unicode : Encoding.UTF8;
        sr.ReadBlock(block, 0, 3);
        sBlock = new String(block);
        SourceFile.Seek(0, 0);

    }
    catch (Exception ex)
    {
        String Error = "Error Accessing: " + TheFile  + " System Message: " + ex.Message;
        EventLog.LogEvent(dtmLogging.LogEventType.Error, Error);
        MessageError(Error, "MyFunction()");
    }
    if(sBlock=="ABC")
    {
MyFunction(SourceFile);  //THIS LINE DOES NOT COMPILE: Use of unassigned variables
    }

建议更改://如果我进行此更改应用程序似乎工作正常,但我不确定这是否“正确”

    FileStream SourceFile =null;
    String sBlock ="";
    Encoding encoding = null;
    StreamReader sr = null;

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我建议在声明中将变量设置为null,至少在例如示例代码的情况下。在这种情况下,将其设置为null实际上会掩盖代码所写的另一个问题:catch块允许该方法继续执行(并尝试使用FileStream对象),即使出现问题并且FileStream对象是可能处于未知状态,不应该使用。

你看到"红色错误的原因"最初是因为代码可以通过"捕获块。如果您在catch块的末尾添加了returnthrow以将控制权返回给调用者,则红色错误将消失,您无需将变量设置为空。

要回答原始问题,按照您的方式声明变量可能是构造代码的合理方法。更好的方法是将所有操作合并到try块中的FileStream上,以便可以在同一个块中定义和引用变量。如果try块开始变得太大,则可能表明您应该将其某些内容重构为可以在try块内调用的较小实用程序方法。 / p>

还有一个相关观点:对于需要在使用后需要关闭或以其他方式清理的对象(即实现IDisposable接口的任何东西),你应该有using个声明。这可以确保文件被关闭并释放其他资源,而不管其余代码中发生了什么。

例如:

try
{
    using (FileStream SourceFile = File.OpenRead(TheFile))
    using (StreamReader sr = new StreamReader(SourceFile))
    {
        char[] block = new char[3];
        byte[] header = new byte[6];
        SourceFile.Read(header, 0, 6);
        SourceFile.Seek(0, 0);
        Encoding encoding = (header[1] == 0 && header[3] == 0 && header[5] == 0) ? Encoding.Unicode : Encoding.UTF8;
        sr.ReadBlock(block, 0, 3);
        String sBlock = new String(block);
        SourceFile.Seek(0, 0);

        if (sBlock=="ABC")
        {
            MyFunction(SourceFile);
        }

        // And do anything else you want with SourceFile & sr here
    }
}
catch (Exception ex)
{
    String Error = "Error Accessing: " + TheFile  + " System Message: " + ex.Message;
    EventLog.LogEvent(dtmLogging.LogEventType.Error, Error);
    MessageError(Error, "MyFunction()");
}

希望这有帮助。

答案 1 :(得分:0)

SourceFile已经在Try块中定义,以后它不会在范围内。它充当仅用于Try块的局部变量。

以下链接也会有所帮助。

Why aren't variables declared in "try" in scope in "catch" or "finally"?