Racket中with-handlers未按预期工作:TCP端口检测函数始终返回#t
问题分析与解决
你的代码问题出在函数最后固定返回了#t——不管with-handlers块里的逻辑是成功建立连接,还是触发异常返回#f,函数都会执行最后的#t并返回它,这就是为什么始终得到#t。
修正后的代码
#lang racket (define (port-open? host port) (with-handlers ([exn:fail:network? (lambda (exp) #f)]) (call-with-values (lambda () (tcp-connect host port)) (lambda (in out) (close-input-port in) (close-output-port out) #t)))) (port-open? "127.0.0.1" 70)
关键改动说明
- 移除了函数末尾多余的
#t,让with-handlers块的执行结果直接作为函数返回值 - 新增端口关闭逻辑:
tcp-connect成功会返回输入、输出两个端口,必须手动关闭避免资源泄漏,这里用call-with-values接收端口并关闭,之后返回#t表示端口开放 - 异常处理逻辑保持不变:遇到网络异常(比如端口关闭、无法连接)时返回
#f
内容的提问来源于stack exchange,提问作者beep
相关产品推荐
相关产品推荐

