我最近开始用Ruby编程,我正在研究异常处理
我想知道sure是否是C#中finally的Ruby等价物?我应该:
file=file.open(“myFile.txt”、“w”)
开始
文件<&书信电报;“#{content}\n”
营救
#在这里处理错误
确保
file.close,除非file.nil?
终止
还是我应该这样做
存储文件
file=file.open(“myFile.txt”、“w”)
开始
文件<&书信电报;“#{content}\n”
file.close
营救
#在这里处理错误
确保
file.close,除非file.nil?
终止
是否确保无论发生什么情况都能调用,即使没有引发异常
是,确保确保始终对代码进行评估。这就是为什么它被称为确保。因此,它最终相当于Java和C的
开始/救援/其他/确保/结束的一般流程如下所示:
开始
#可能引起异常的事情
rescue SomeExceptionClass=>;某些变量
#处理某些异常的代码
拯救其他人例外=>;其他变量
#处理其他异常的代码
其他的
#仅在引发*no*异常时运行的代码
确保
#确保此代码始终运行,无论发生什么情况
#不会更改块的最终值
终止
您可以省去救援、确保或其他。您还可以省略变量,在这种情况下,您将无法在异常处理代码中检查异常。(好的,您可以始终使用全局异常变量来访问引发的最后一个异常,但这有点粗糙。)并且您可以省略exception类,在这种情况下,继承自StandardError的所有异常都将被捕获。(请注意,这并不意味着捕获所有异常,因为有些异常是异常的实例,但不是标准错误。大多数非常严重的异常会损害程序的完整性,如系统堆栈错误,异常,安全错误r,未实现错误,加载错误,语法错误,脚本错误,中断,信号异常或系统退出)
某些块形成隐式异常块。例如,方法定义隐式地也是异常块,因此
def foo
开始
# ...
营救
# ...
终止
终止
你只是写
def foo
# ...
营救
# ...
终止
或
def foo
# ...
确保
# ...
终止
这同样适用于类定义和模块定义
然而,在您所询问的具体案例中,实际上有一个更好的成语。通常,当您使用某些需要在最后清理的资源时,您可以通过将一个块传递给一个方法来完成清理。它类似于在C#中使用块的,不同的是Ruby实际上功能强大,您不必等待Microsoft的高级牧师从山上下来,为您优雅地更改他们的编译器。在Ruby中,您可以自己实现它:
#这是您想要做的:
File.open('myFile.txt','w')do | File|
file.put内容
终止
#这就是您可以实现它的方式:
def File.open(文件名,mode='r',perm=nil,opt=nil)
yield filehandle=new(文件名、模式、perm、opt)
确保
filehandle&;。关
终止
您知道什么:这是核心库中已经提供的文件。打开。但这是一种通用模式,您也可以在自己的代码中使用,用于实现任何类型的资源清理(使用C#中的)或事务或您可能想到的任何其他内容
如果获取和释放资源分布在程序的不同部分,则这是唯一不起作用的情况。但是,如果它是本地化的,如您的示例中所示,那么您可以轻松地使用这些资源块
顺便说一句:在现代C#中,使用实际上是多余的,因为您可以自己实现Ruby风格的资源块:
类文件
{
静态T打开<;T>;(字符串文件名、字符串模式、Func<;文件、T>;块)
{
var handle=新文件(文件名、模式);
尝试
{
返回块(手柄);
}
最后
{
handle.Dispose();
}
}
}
//用法:
打开(“myFile.txt”、“w”、“文件)=>;
{
文件写入线(目录);
});