Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a complicated function which contains many calls to NIntegrate, NSolve, FindRoot and other superfunctions in many places. My function is organized in such a way that every call to a superfunction is assigned to unique Blocked variable. Sometimes these functions produce Messages but it is not obvious which call has generated the message. I wish to find a straighforward way to know which call has generated the message. It would be great to include this information in the Message itself but just printing this information before/after the Message would be sufficient.

I know that there is undocumented function Internal`HandlerBlock which seemingly can do such tasks but I do not know how to restrict it to handle only printed messages.

For example,

Internal`HandlerBlock[{"Message", 
  If[MatchQ[#, Hold[_, True]], Print[#]] &}, 
 NIntegrate[Cos[20000 x]/Sqrt[x], {x, 0, 1}]]

Produces many prints but only one of them corresponds to the actually printed one Message.

share|improve this question
1  
See the answers to this question, especially rcollyer's and Mr.Wizard's. You might be able to add a hook to the printed message to also display the function name –  rm -rf Aug 28 '12 at 19:38
add comment

1 Answer

up vote 6 down vote accepted

Following R.M's suggestion, and shamelessly lifting code from the Wizard’s fine answer there, you can use Stack[] and get the following:

SetAttributes[withTaggedMsg, HoldAll]
withTaggedMsg[] := 
 Function[, 
  Internal`InheritedBlock[{MessagePacket}, Unprotect[MessagePacket];
   MessagePacket[name__, BoxData[obj_, form_]] /; ! TrueQ[$tagMsg] := 
        Block[{$tagMsg = True}, 
     Identity@
      MessagePacket[name, 
       BoxData[RowBox[{ToBoxes@
           Style[Row[{"With stack", Stack[][[3 ;;]], Spacer[5]}, " "],
             Black], obj}], form]]];
   #], HoldAll]

screen capture

share|improve this answer
1  
Ah, I even upvoted Mr.Wizard's solution but completely forgot it! Thank you for pointing out. –  Alexey Popkov Aug 29 '12 at 2:30
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.