问题描述
由于访问了错误的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 '
解决方法
如果导入segfaults模块,则可以捕获这种类型的错误。我认为出于性能原因,默认情况下未将其导入。
为什么它首先是错误尚不清楚。字符串在Nim中曾经是零的,所以我假设在编写parsecsv.rowEntry
时,它将返回nil
,然后可以检查该字符串。这不可能了,因此应该更新proc以引发错误。我会调查一下。
如documentation中所述:
## `parser.rowEntry("NotExistEntry")` causes SIGSEGV fault.
您的标头存储在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"