Nim中的try块未捕获该错误

问题描述

由于访问了错误的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"