Here's another approach, that i think might be more robust because it just traps the exception that you want to avoid getting raised to the user.
Code:
declare
   no_mv_log exception;
   pragma exception_init(no_mv_log,-12002);
begin
   execute immediate 'drop materialized view log on my_table';
exception
   when no_mv_log then null;
end;
Alternatively, you could code as ...
Code:
declare
   mv_log_exists exception;
   pragma exception_init(mv_log_exists,-12000);
begin
   execute immediate 'create materialized view log on my_table';
exception
   when mv_log_exists then null;
end;
... or even ...
Code:
declare
   mv_log_exists exception;
   pragma exception_init(mv_log_exists,-12000);
begin
   execute immediate 'create materialized view log on my_table';
exception
   when mv_log_exists then 
      execute immediate 'drop materialized view log on my_table';
      execute immediate 'create materialized view log on my_table';
end;