我有以下功能
function calculate(s:string):integer;
begin
try
strtoint(s);
do_something;
except
result:=-1;
end;
end;
Run Code Online (Sandbox Code Playgroud)
使用这样的例外会有什么后果吗?
如果目的是检查输入字符串的有效性,那么有比异常处理程序更好的方法.要从字符串转换为整数并检测无效输入,请使用TryStrToInt:
var
value: Integer;
...
if TryStrToInt(s, Value) then
Result := ...
else
Result := -1;
Run Code Online (Sandbox Code Playgroud)
True如果字符串可以转换为整数,则返回此函数;如果是,则通过第二个参数返回整数,out参数.否则函数返回False.在您的代码中,您忽略转换后的整数值,但如果需要,它可用.
在我看来,这比异常处理程序更受欢迎,因为它更加明确和简洁.更不用说避免引发和捕获异常的性能开销.
当然,您的代码将检测除无效字符串以外的其他故障.一个潜在的错误来源是您的do_something程序.如果您真的想要吞下该过程引发的任何异常,则需要一个异常处理程序.但是,我更倾向于怀疑你的原始意图更有可能只捕获无效的字符串输入.在这种情况下,您的代码不正确.
另一个错误来源是如果s恰好是无效的字符串变量.但如果发生这种情况,那么你的程序的整个基础都会从你的下方拉出来,我个人认为你不应该期望优雅地处理这些场景.
建议您的部分问题是您的代码可能不具有真正的代表性.例如,如果输入有效,它似乎不设置返回值.我们不确定您的异常处理程序的意图是什么.我猜你的意思是在调用中捕获错误,StrToInt但我无法确定.