On May 1, 9:45 am, Marco Streng <marco.str...@gmail.com> wrote:
> And how to fix this? I have three ideas that all have a downside:
> * Catching the error will destroy a valuable traceback (which I removed
> above). Or is there a way to preserve that traceback and have it printed
> somehow?

Apparently the traceback is there. One should be able to retrieve the
most recent one:

exc_type, exc_value, exc_traceback = sys.exc_info()

(just google for it -- there's some info in stack exchange about it)

So we could do something along the lines:

try:
    reload_modified_attached_files()
except:
    INFO = sys.exc_info()
    print "Warning. An exception occurred during reloading of ..."
    print_traceback(INFO)
    print "continuing with command you entered. Funny things can
happen"
execute_command()

The problem with this is that usually the right thing to do IS to
abort if an error occurs on reloading an attached file. People will
probably get used to just entering an empty command to trigger reload
after they've edited though, so the extraneous execution of an empty
command will probably not affect much.

> * How about attempting to reload only once (move the line "attached[fpath]
> = os.path.getmtime(fpath)" to just before "execfile" in
> sage.misc.preparser.load)? This may hide the problem: there will be only
> one error message when attach fails, which the user may mistake for an
> error related to the last input, and then think the latest version of the
> file is safely attached, while actually an old version is still being used.

If that is accompanied by an explicit message
"detaching file ... due to exception.
Execute 'attach(<file>)' to reattach."
I think that's the cleanest (and we actually do detach the file)

The other option is indeed
"suspending reloading file ... due to exception
Reload will be reattempted if file modification is detected"

(and then just update the reference timestamp as you suggest)

> * Is it possible to separate the reloading from the evaluation of the input
> line? This may be the best option. Any idea how to implement that? Looks
> like this is handled in IPython/core/interactiveshell.py , so it would mean
> patching IPython?

I think the option above, catch exception but print the traceback
anyway, would accomplish this in essence. Of course now we have to
answer questions such as: should we catch exceptions for each reloaded
file separately? Do we just print all tracebacks if multiple fail? Or
do we abort after first reload?

For reference, Magma does:

> Attach("a.m");
> Attach("b.m");
> intrinsic_defined_in_a();
True
[invalidate a.m and b.m]
> 1;
[PC]
[PC] User error: syntax error at end of input
[PC]
[PC] User error: syntax error at end of input
> intrinsic_defined_in_a();
User error: Identifier 'intrinsic_defined_in_a' has not been declared
or assigned

So:
 - it reloads all attachments separately
 - it still executes the command
 - definitions in a failed reload really disappear
 - reloads are only reattempted when another change is detected.

Due to python semantics, we cannot let previous attachments really
disappear, but we can do the rest.

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to