Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you catch errors in QML declaritive code?

I have a (declarative) line in my QML file which is logging an error and I want to catch it and log certain variables to try and figure out what's going on. The line is something like (contained in a Repeater hence the use of index):

a: ((n === -1) || (n - p > 7) || (index >= t)) ? "" : b[p+index].c

(no, those aren't my actual variable names, I've renamed them to prevent information leakage - the actual names are not important).

When running the code, I am occasionally getting the error:

file:///path/to/SomeFile.qml:7: TypeError: Cannot read property 'c' of undefined

leading me to believe that one of those variables is wrong somehow when the a field is being modified based on the other variables.

I am aware of try/catch in procudural QML code but I'm not sure how to do something similar for declarative code (or even if it's possible).

Is there a way to catch that error and print out all the relevant variables that exist at the time the error occurs?

like image 821
paxdiablo Avatar asked Nov 18 '19 02:11

paxdiablo


1 Answers

Maybe I'm not understanding the question, but the a: assignment can be the result of a function or even just a block of JS code which returns some value. So you can freely use try/catch or anything else for that matter.

a: {
  try {
    return ((n === -1) || (n - p > 7) || (index >= t)) ? "" : b[p+index].c;
  } 
  catch(e) {
    console.log(e);
    return "FUBAR";
  }
}

ADDED: The return keywords are actually optional here, works just as well w/out them.

Also to point out:

a: ((n === -1) || (n - p > 7) || (index >= t)) ? "" : b[p+index].c;

is same as:

a: { ((n === -1) || (n - p > 7) || (index >= t)) ? "" : b[p+index].c; }

The curly braces are simply optional for single-line expressions.

like image 116
Maxim Paperno Avatar answered Sep 30 '22 04:09

Maxim Paperno