我正在努力解决C#多年没有编码的问题以及我之前使用ANSI C的经验。
我已阅读了大量书籍并在网上搜索,但有一方面正在躲避我,我希望有人可以提供帮助。
在过去,我会声明一个函数,如果函数中有可能发生某些事情(即找不到文件等),则声明返回为整数。如果一切顺利,我会返回0,如果不是,则返回值。该值将对应于函数未能完全执行的位置,并且我可以从我调用它的位置进行相应的分支。
if(function1())
{
// all my error stuff, maybe a switch/case etc.
}
我在C#中找到的所有例子似乎都避免使用这种技术,我希望能在这里得到一些理解。
感谢您的期待。
(我知道我是化石)。 :)
答案 0 :(得分:3)
例外是您在C#和类似语言中使用的方法。
它是这样的:
try
{
function();
}
catch(FileNotFoundException e)
{
// File not found
}
catch(UnauthorizedAccessException e)
{
// User doesn't have right to access file
}
// etc...
为了完成这项工作,function
不应返回状态代码,而是在出现错误时抛出异常。
请注意,如果您尝试访问文件并且其中一个错误发生,框架将抛出我在上面的代码块中说明的异常。所以你自己实际上不必这样做。
此外,在C#中没有从积分值到bool的隐式转换,即如果if(function())
返回function
,则int
无效。你需要这样写:
if(function() != 0)
{
// all your error stuff
}
答案 1 :(得分:2)
没有什么可以阻止你这样做(尽管有更好的方法来处理错误 - 例如exceptions。)
如果你想继续这种方法,你遇到的最大问题是在C#中你不能将整数视为布尔值,所以你的if测试不会编译。你需要的是:
if (function1() != 0)
{
}
但要检查您需要的价值:
int result = function1();
switch (result)
{
case 1:
// Handle this case
break;
case 2:
// Handle this case
break;
default:
// All OK
break;
}
最好为每个错误案例返回一个枚举类型,这样你就不会有魔术数字,但例外是要走的路:
try
{
function1();
}
catch (SpecificException1 e1)
{
// Handle this case
}
catch (SpecificException2 e2)
{
// Handle this case
}
你不应该拥有的是一般异常处理程序:
catch (Exception e)
{
}
这只是隐藏了其他潜在的问题。
答案 2 :(得分:1)
if(function()==1)
{
}
int function()
{
int returnVal =0;
// do stuff
// if true return returnVal =1 else set returnVal =0;
return returnVal;
}
答案 3 :(得分:1)
如果你想遵循检查返回值的模式而不是管理错误,你最好使用enumarations而不是普通数字。
例如:
public enum ResultType
{
Error = 0,
Success,
Waiting
}
public ResultType function()
{
if (still_waiting)
return ResultType.Waiting;
if (error_has_occured)
return ResultType.Error;
return ResultType.Success;
}
public void Main()
{
ResultType result = function();
switch (result)
{
case ResultType.Success:
MessageBox.Show("all is good");
break;
case ResultType.Waiting:
MessageBox.Show("still waiting...");
break;
case ResultType.Error:
MessageBox.Show("error has occurred");
break;
}
}
在幕后,它仍在使用数字,但你对每个数字都有一些含义。