Nim 中的 try 块未捕获该错误
The error is not caught with try block in Nim
错误会因为访问了错误的CSV行而被抛出,但错误不会被try块捕获。为什么,以及如何捕捉它?
import parsecsv
# Prepare a file
let content = """One,Two,Three,Four
1,2,3,4
10,20,30,40
100,200,300,400
"""
writeFile("temp.csv", content)
var p: CsvParser
p.open("temp.csv")
p.readHeaderRow()
while p.readRow():
try:
echo p.rowEntry("wrong") # <= Error here
except:
echo "error"
p.close()
错误
$ nim c -r run.nim
Traceback (most recent call last)
/alex/projects/run.nim(33) run
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
Error: execution of an external program failed: '/alex/projects/run '
如 documentation 中所述:
## `parser.rowEntry("NotExistEntry")` causes SIGSEGV fault.
您的 headers 存储在 p.headers
中,因此您可以使用如下代码“捕获”错误:
var p: CsvParser
p.open("temp.csv")
p.readHeaderRow()
while p.readRow():
if "wrong" in p.headers:
echo p.rowEntry("wrong")
else:
echo "error"
如果你导入了segfaults模块,这种类型的错误是可以捕获的。出于性能原因,我认为默认情况下不会导入它。
为什么它首先是一个错误还不太清楚。字符串过去在 Nim 中是可空的,所以我假设在写入 parsecsv.rowEntry
时,它将 return nil
,然后您可以检查它。这不再可能了,因此可能应该更新 proc 以引发错误。我会调查一下。
错误会因为访问了错误的CSV行而被抛出,但错误不会被try块捕获。为什么,以及如何捕捉它?
import parsecsv
# Prepare a file
let content = """One,Two,Three,Four
1,2,3,4
10,20,30,40
100,200,300,400
"""
writeFile("temp.csv", content)
var p: CsvParser
p.open("temp.csv")
p.readHeaderRow()
while p.readRow():
try:
echo p.rowEntry("wrong") # <= Error here
except:
echo "error"
p.close()
错误
$ nim c -r run.nim
Traceback (most recent call last)
/alex/projects/run.nim(33) run
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
Error: execution of an external program failed: '/alex/projects/run '
如 documentation 中所述:
## `parser.rowEntry("NotExistEntry")` causes SIGSEGV fault.
您的 headers 存储在 p.headers
中,因此您可以使用如下代码“捕获”错误:
var p: CsvParser
p.open("temp.csv")
p.readHeaderRow()
while p.readRow():
if "wrong" in p.headers:
echo p.rowEntry("wrong")
else:
echo "error"
如果你导入了segfaults模块,这种类型的错误是可以捕获的。出于性能原因,我认为默认情况下不会导入它。
为什么它首先是一个错误还不太清楚。字符串过去在 Nim 中是可空的,所以我假设在写入 parsecsv.rowEntry
时,它将 return nil
,然后您可以检查它。这不再可能了,因此可能应该更新 proc 以引发错误。我会调查一下。