如何在 class 方法中使用 Try-Catch-Finally 块?

How does one use the Try-Catch-Finally block in a class method?

我尝试在 class 方法中设置 try-catch-finally 块时收到相互矛盾的错误消息,其中 returns 一个字符串。

我的代码是:

class exampleClass {    
    [string]Create() {
        try {
            $rsa_Base64 = "string"            
            return $rsa_Base64
        }
        catch {
            {...}
        }
        finally {
            Remove-Item -Path $env:TEMP\test.txt
        }        
    }
}

在这种情况下我得到错误:Not all code path returns value within method.

如果我将 return 语句移动到 finally 块,我会得到错误:Flow of control cannot leave a Finally block.

我想添加 finally 块以确保删除在 try 语句中创建的文件。

您可以避免问题,方法是使用return语句无条件 ,在 try / catch/ finally 语句之外:

class exampleClass {    
    [string]Create() {
        $rsa_Base64 = ''  # must initialize the variable
        try {
            $rsa_Base64 = "string"            
        }
        catch {
            {...}
        }
        finally {
            Remove-Item -Path $env:TEMP\test.txt
        }
        return $rsa_Base64
    }
}

注意使用''初始化变量;使用 $null 最终不会有效,因为该方法是 [string] 类型的,并且 PowerShell 不支持 [string] 值中的 $null 并将它们转换为 ''(空字符串)- 有关详细信息,请参阅


更恰当,但是,您应该确保您的 catch 分支也包含退出作用域的流程控制语句[1],即 return or throw(虽然 exit 在技术上也有效,但它应该只用于 脚本文件, 因为它作为一个整体退出会话):

class exampleClass {    
    [string]Create() {
        try {
            $rsa_Base64 = "string"            
            return $rsa_Base64
        }
        catch {
            {...}
            return ''  # must exit the method from this block too 
        }
        finally {
            Remove-Item -Path $env:TEMP\test.txt
        }        
    }
}

[1] 相比之下,finally 块不仅 不需要 作用域退出语句,在设计上 不支持任何。原因是此块 运行 在正常控制流之外,仅用于清理。