首页 > 解决方案 > 是否可以捕获 glob 的错误输出?

问题描述

假设如果我包含以下glob命令try/trap/finally

proc generateSubmissionFolder {cover_letter_resume submission_path} {
   set submission_parent [file dirname $submission_path]
   set latest_submission_folder [lindex [lsort [glob -directory $submission_parent -type d *]] end]
   set latest_submission_file [lindex [glob -directory $latest_submission_folder *[file extension $cover_letter_resume]] end]
   createSubmissionFolder $latest_submission_file $submission_path
}


proc createSubmissionFolder {source destination} {
    puts "Creating $destination folder."
    file mkdir $destination
    puts "Copying $source to $destination"
    file copy $source $destination
}


try {

    # I gathered user input and stored them in the variables $company_name and $position.

    set submission_path [file join $company_name $position $yearmonthday]

    if {[file exists [file dirname $submission_path]]} {
        generateSubmissionFolder $coverletterresume $submission_path
    } else {
        createSubmissionFolder $coverletterresume $submission_path
    } 

} trap {Value Empty} {errormessage} {
   puts "$errormessage"
} finally {
   puts "$argv0 exiting."
}

如果没有找到文件夹,我想提供一条人类可读的错误消息,但我不确定要捕获什么错误。根据我上一个问题的答案:

Tcl 没有预定义的异常层次结构。

我尝试的唯一解决方法是使用-nocomplain开关,然后检查是否latest_submission_folder为空白。

有没有办法捕获一个FileNotFoundFolderNotFound错误?

标签: tclthrow

解决方案


对于像您的示例这样的琐碎情况,请使用on error处理程序,而不是trap. 或使用catch代替try.

示例tclsh会话:

% try { glob *.bar } on error {what} { puts "Ooops: $what" }
Ooops: no files matched glob pattern "*.bar"
% if {[catch { glob *.bar } result] == 1} { puts "Ooops: $result" }
Ooops: no files matched glob pattern "*.bar"

或者,如果您确实想使用trap,因为您还想处理来自更复杂代码的一堆其他可能的特定错误,则会glob引发TCL OPERATION GLOB NOMATCH失败:

% try { glob *.bar } trap {TCL OPERATION GLOB NOMATCH} {msg} { puts "Ooops: $msg" }
Ooops: no files matched glob pattern "*.bar"

您可以通过以下方式发现trap用于任何给定命令的特定错误的内容:

% catch { glob *.bar } result errdict
1
% dict get $errdict -errorcode
TCL OPERATION GLOB NOMATCH

推荐阅读