所以我对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;
感谢您的帮助
答案 0 :(得分:2)
我建议不在声明中将变量设置为null,至少在例如示例代码的情况下。在这种情况下,将其设置为null实际上会掩盖代码所写的另一个问题:catch
块允许该方法继续执行(并尝试使用FileStream对象),即使出现问题并且FileStream对象是可能处于未知状态,不应该使用。
你看到"红色错误的原因"最初是因为代码可以通过"捕获块。如果您在catch块的末尾添加了return
或throw
以将控制权返回给调用者,则红色错误将消失,您无需将变量设置为空。
要回答原始问题,按照您的方式声明变量可能是构造代码的合理方法。更好的方法是将所有操作合并到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"?