Skip to content

Commit ec92315

Browse files
committed
Handle error and output
1 parent 566d42f commit ec92315

2 files changed

Lines changed: 37 additions & 16 deletions

File tree

R/notebook.R

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,23 @@ local({
1818
tryCatch({
1919
line <- readLines(con, n = 1)
2020
request <- jsonlite::fromJSON(line)
21-
cat(sprintf("[%s]\n%s\n",
22-
request$time, request$expr))
23-
expr <- parse(text = request$expr)
24-
res <- try(eval(expr, globalenv()), silent = TRUE)
25-
str <- list(
26-
type = if (inherits(res, "try-error")) "error" else "output",
27-
result = utils::capture.output(print(res))
21+
cat(sprintf("[%s]\n%s\n", request$time, request$expr))
22+
str <- tryCatch({
23+
expr <- parse(text = request$expr)
24+
out <- eval(expr, globalenv())
25+
list(
26+
type = "output",
27+
result = paste0(utils::capture.output(print(out)), collapse = "\n")
28+
)
29+
}, error = function(e) {
30+
list(
31+
type = "error",
32+
result = conditionMessage(e)
33+
)
34+
}
2835
)
29-
result <- jsonlite::toJSON(str, auto_unbox = TRUE, force = TRUE)
30-
writeLines(result, con)
36+
response <- jsonlite::toJSON(str, auto_unbox = TRUE, force = TRUE)
37+
writeLines(response, con)
3138
}, error = function(e) {
3239
message(e)
3340
}, finally = close(con))

src/notebook.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { spawn, ChildProcess } from 'child_process';
44
import { dirname } from 'path';
55
import getPort = require('get-port');
66

7+
interface REvalOutput {
8+
type: "output" | "error";
9+
result: string;
10+
}
11+
712
class RKernel {
813
private kernelScript: string;
914
private cwd: string;
@@ -52,7 +57,7 @@ class RKernel {
5257
await this.start();
5358
}
5459

55-
public async eval(cell: vscode.NotebookCell): Promise<string> {
60+
public async eval(cell: vscode.NotebookCell): Promise<REvalOutput> {
5661
if (this.process) {
5762
const client = net.createConnection({ port: this.port }, () => {
5863
console.log('connected to server!');
@@ -73,13 +78,17 @@ class RKernel {
7378
const response = data.toString();
7479
console.log(response);
7580
client.end();
76-
const output = JSON.parse(response);
77-
const result: string[] = output.result;
78-
resolve(result.join('\n'));
81+
const output: REvalOutput = JSON.parse(response);
82+
resolve(output);
7983
});
8084

8185
client.on('error', (err) => {
82-
reject(err.message);
86+
reject({
87+
type: "error",
88+
result: [
89+
err.message
90+
],
91+
});
8392
});
8493
});
8594
}
@@ -103,7 +112,7 @@ class RNotebook implements vscode.Disposable {
103112
this.kernel.restart();
104113
}
105114

106-
public async eval(cell: vscode.NotebookCell): Promise<string> {
115+
public async eval(cell: vscode.NotebookCell): Promise<REvalOutput> {
107116
await this.kernel.start();
108117
return this.kernel.eval(cell);
109118
}
@@ -285,9 +294,12 @@ export class RNotebookProvider implements vscode.NotebookContentProvider, vscode
285294
cell.metadata.runStartTime = start;
286295
cell.metadata.executionOrder = ++this.runIndex;
287296
const output = await notebook.eval(cell);
297+
if (output.type === "error") {
298+
throw new Error(output.result);
299+
}
288300
cell.outputs = [{
289301
outputKind: vscode.CellOutputKind.Text,
290-
text: output,
302+
text: output.result,
291303
}];
292304
cell.metadata.runState = vscode.NotebookCellRunState.Success;
293305
cell.metadata.lastRunDuration = +new Date() - start;
@@ -298,6 +310,8 @@ export class RNotebookProvider implements vscode.NotebookContentProvider, vscode
298310
ename: '',
299311
traceback: [],
300312
}];
313+
cell.metadata.runState = vscode.NotebookCellRunState.Error;
314+
cell.metadata.lastRunDuration = undefined;
301315
}
302316
}
303317
}

0 commit comments

Comments
 (0)