You can do something like this:
resetMessages[symbol_] :=
With[{mysymbol = symbol},
Unprotect[$MessageList]; $MessageList =
DeleteCases[$MessageList, HoldForm[MessageName[mysymbol, _]]];
Protect[$MessageList];]
And you will have to call it after each function...
Sqrt[a, b, c, d]; Exp[a, b]; resetMessages[Exp]; Sqrt[a, b, c, d]; \
Exp[a, b]; resetMessages[Exp]; Sqrt[a, b, c, d]; Exp[a, b]; \
resetMessages[Exp]; Sqrt[a, b, c, d]; Exp[a, b]; resetMessages[Exp]; \
Sqrt[a, b, c, d]; Exp[a, b]; resetMessages[Exp]; Sqrt[a, b, c, d]; \
Exp[a, b]; resetMessages[Exp]; Sqrt[a, b, c, d]; Exp[a, b]; \
resetMessages[Exp];
Sqrt::argx: Sqrt called with 4 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Sqrt::argx: Sqrt called with 4 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Sqrt::argx: Sqrt called with 4 arguments; 1 argument is expected. >>
General::stop: Further output of Sqrt::argx will be suppressed during this calculation. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Exp::argx: Exp called with 2 arguments; 1 argument is expected. >>
Assert
would be useful for this? $\endgroup$