如何在 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
块不仅 不需要 作用域退出语句,在设计上 不支持任何。原因是此块 运行 在正常控制流之外,仅用于清理。
我尝试在 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
块不仅 不需要 作用域退出语句,在设计上 不支持任何。原因是此块 运行 在正常控制流之外,仅用于清理。