如何在 Ballerina 中打印完整的错误堆栈跟踪
How to print the complete error strack trace in Ballerina
如果在程序执行期间发生错误,我有一个功能可以将错误记录到日志文件中。
string LOG_LEVEL_ERROR = "ERROR";
public function logError(string message){
var logTime = getTime();
string strLog = logTime + " - " + LOG_LEVEL_ERROR + " - " + message;
writeToFile(strLog);
}
它的调用如下。这会将错误消息成功写入日志文件。
logError("[ERROR] cleanup failed " + e.message);
然而,为了更具描述性,我需要打印完整的错误堆栈跟踪,而不仅仅是错误消息。
注意:该过程是自动化的,因此无法手动将错误发布到日志文件。
您可以使用 ballerina 中现有的日志记录支持,而不是编写您自己的错误日志记录函数:
import ballerina/log;
function logError(error e){
log:printError("Error sending response", err = e);
}
要将日志发布到文件,请将 stderr 流重定向到文件。
$ ballerina run program.bal 2> b7a-user.log
查找更多信息here
在 Ballerina 中,堆栈跟踪仅与抛出的错误相关联。通常,您会返回错误而不是抛出错误,在这种情况下您将无法获得堆栈跟踪。如果您真的想要从返回的错误中跟踪堆栈,您可以将函数调用返回的错误设置为从当前函数返回的错误的原因。然后您可以使用这些原因链来构建您自己的各种堆栈跟踪。下面的例子有两种情况:抛出的错误和返回的错误(设置了原因)。
import ballerina/io;
public function main() {
error e = returnedError();
io:println(e);
io:println();
thrownError();
}
function thrownError() {
test1();
}
function test1() {
error e = {message: "ERROR from test 2"};
throw e;
}
function returnedError() returns error {
error e = test2();
return {message: "ERROR from test 3", cause: e};
}
function test2() returns error {
return {message: "ERROR from test 4"};
}
以上程序将产生以下输出。
{message:"ERROR from test 3", cause:{message:"ERROR from test 4", cause:null}}
error: ballerina/runtime:CallFailedException, message: call failed
at main(test.bal:7)
caused by ballerina/runtime:CallFailedException, message: call failed
at thrownError(test.bal:11)
caused by error, message: eRROR from test 2
at test1(test.bal:16)
但请注意,将错误设置为原因仍然不会为您提供源文件和行号等信息。
如果在程序执行期间发生错误,我有一个功能可以将错误记录到日志文件中。
string LOG_LEVEL_ERROR = "ERROR";
public function logError(string message){
var logTime = getTime();
string strLog = logTime + " - " + LOG_LEVEL_ERROR + " - " + message;
writeToFile(strLog);
}
它的调用如下。这会将错误消息成功写入日志文件。
logError("[ERROR] cleanup failed " + e.message);
然而,为了更具描述性,我需要打印完整的错误堆栈跟踪,而不仅仅是错误消息。
注意:该过程是自动化的,因此无法手动将错误发布到日志文件。
您可以使用 ballerina 中现有的日志记录支持,而不是编写您自己的错误日志记录函数:
import ballerina/log;
function logError(error e){
log:printError("Error sending response", err = e);
}
要将日志发布到文件,请将 stderr 流重定向到文件。
$ ballerina run program.bal 2> b7a-user.log
查找更多信息here
在 Ballerina 中,堆栈跟踪仅与抛出的错误相关联。通常,您会返回错误而不是抛出错误,在这种情况下您将无法获得堆栈跟踪。如果您真的想要从返回的错误中跟踪堆栈,您可以将函数调用返回的错误设置为从当前函数返回的错误的原因。然后您可以使用这些原因链来构建您自己的各种堆栈跟踪。下面的例子有两种情况:抛出的错误和返回的错误(设置了原因)。
import ballerina/io;
public function main() {
error e = returnedError();
io:println(e);
io:println();
thrownError();
}
function thrownError() {
test1();
}
function test1() {
error e = {message: "ERROR from test 2"};
throw e;
}
function returnedError() returns error {
error e = test2();
return {message: "ERROR from test 3", cause: e};
}
function test2() returns error {
return {message: "ERROR from test 4"};
}
以上程序将产生以下输出。
{message:"ERROR from test 3", cause:{message:"ERROR from test 4", cause:null}}
error: ballerina/runtime:CallFailedException, message: call failed
at main(test.bal:7)
caused by ballerina/runtime:CallFailedException, message: call failed
at thrownError(test.bal:11)
caused by error, message: eRROR from test 2
at test1(test.bal:16)
但请注意,将错误设置为原因仍然不会为您提供源文件和行号等信息。