robertklep/nefit-easy-commands

"Catch" doesn't catch all exceptions

Opened this issue · 2 comments

I'm using your library successfully, really thanks for the work.
I use it in an ioBroker (homeautomation server) environment which is JavaScript based.

My problem is, that from time to time I get an uncaugt exception which crashes the JavaScript engine in ioBroker.
I based my code on your example:

function ReadValues()
{
// Instantiate client
const client = NefitEasyClient({
serialNumber : "xx",
accessKey : "yy",
password : "zz",
});
// Connect client and retrieve status and pressure.
client.connect().then( () =>
{
return Promise.all([ client.status(), client.pressure() ]);
}).then(response =>
{
const status = response[0];
console.log(JSON.stringify(status));
const pressure = response[1];
console.log("Temperature is set to " + status['temp setpoint'].toFixed(1) + " °C, current is " + status['in house temp'].toFixed(1) + " °C.\n" +
"Outside temperature is "+status['outdoor temp'].toFixed(1)+" °C.\n" +
"User Mode is "+status['user mode']+".\n" +
"System pressure is " + pressure.pressure + " " + pressure.unit);
}).catch((e) =>
{
console.error(e);
}).finally(() =>
{
client.end();
});
}

My output:

2020-01-02 09:12:01.314 - info: javascript.0 (28942) script.js.common.Nefit: {"user mode":"clock","clock program":"auto","in house status":"ok","in house temp":19.6,"hot water active":true,"boiler indicator":"central heating","control":"room","temp override duration":0,"current switchpoint":24,"ps active":false,"powersave mode":false,"fp active":false,"fireplace mode":false,"temp override":false,"holiday mode":false,"boiler block":null,"boiler lock":null,"boiler maintenance":null,"temp setpoint":21,"temp override temp setpoint":17,"temp manual setpoint":21,"hed enabled":null,"hed device at home":null,"outdoor temp":3,"outdoor source type":"virtual"}
2020-01-02 09:12:01.314 - info: javascript.0 (28942) script.js.common.Nefit: Temperature is set to 21.0 °C, current is 19.6 °C.
Outside temperature is 3.0 °C.
User Mode is clock.
System pressure is 1.8 bar
2020-01-02 09:12:01.342 - error: javascript.0 (28942) uncaught exception: read ECONNRESET
2020-01-02 09:12:01.343 - error: javascript.0 (28942) Error: read ECONNRESET
2020-01-02 09:12:01.963 - error: host.ioBroker Caught by controller[0]: { Error: read ECONNRESET
--
2020-01-02 09:12:01.964 - error: host.ioBroker Caught by controller[0]: at TLSWrap.onread (net.js:622:25)
2020-01-02 09:12:01.964 - error: host.ioBroker Caught by controller[0]: errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read' }

So although the readout was successful, the exception ECONNRESET is thrown and unfortunately not caught be the "catch" statement.

Any hint?
Thanks
Christof

If client.end() throws an exception, it won't get caught.

You could try this:

…
}).finally(() => {
  client.end();
}).catch(e => {})

But I'm not entirely sure where the error is coming from, so there might be another cause for it.

Thanks, I'll give it a try and come back once this happens again.
I added a logging into the new catch() block to get noticed.