How can I better debug my code using logs and excecptions?

G-d willing

Hello guys,
I would like to ask you how can I log the commands I have in a specific function?
The debug and the trace cannot be used inside regular functions.
Basically, my issue is that I have a very long functions that maps fields from one structure to another with different types of values for the fields.
So, in many places inside the code we use Either Text {Correct Type}, and when the Text reached I don’t get any message about it, unless I am checking that using the isRight function.
Is there a way for me to know when Either is using the Left value automatically?

Thanks

Could you show an example of code (ideally with a test script) where you would like or expect logging to happen?

The trace or traceId functions are probably what you are after. Eg

foo : Optional Bar
baz = case foo of
  Nothing -> Left (traceId "Received Nothing")
  Some bar -> Right bar

Every time the Nothing/Left case is hit, you’ll get a log message “Received Nothing”. Outside the IDE, I believe these messages are at the DEBUG level so you’ll have to make sure to set the appropriate logging level.

Where do I set this?

G-d willing

how can I use traceId "Received Nothing" inside a a regular function, for example:

sampleFunction: Int -> Int
sampleFunction num =
  let 
    num2 = num + 2
    num3 = num2 * 3
  in
  num3 

I want to output a log line after the num2 = num + 2, and then another log line after the num3 = num2 * 3

Hi @cohen.avraham,

To understand trace, it’s important to remember that Daml is a functional language: there is no “statement”; everything must return a value. This makes logging a bit awkward, especially outside of do blocks.

The way the trace function works around that it takes two arguments: what to log, and what to return. (traceId is just a shorthand for a trace call that logs exactly what it returns.)

So, in your case, you want to change the expression num + 2 such that it logs a message in addition to returning the value:

sampleFunction: Int -> Int
sampleFunction num =
  let 
    num2 = (trace "here" (num + 2))
    num3 = num2 * 3
  in
  num3

or even, since trace returns the value of its second argument:

sampleFunction: Int -> Int
sampleFunction num =
  (trace "here" (num + 2)) * 3
1 Like