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 以引发错误。我会调查一下。