C#不能捕捉的异常,如AccessViolationException

  在.net的异常机制中,有部分严重的编程错误(系统的某些Corrupted State Exceptions异常)是默认不被用户使用常规的异常捕捉方式捕捉到的。express

  微软的这种设计方式,是让用户必须处理该异常,不然程序将没法正常运行。目前发现两种状况,但解决方法通用。编程

一、AccessViolationException异常

  AccessViolationException:当代码尝试读取或写入还没有分配或没法访问的内存时,非托管或不安全代码中会发生访问冲突。其只在可验证托管代码与非托管代码或不安全的托管代码交互出现。若是异常发生在公共语言运行库保留的内存以外,则公共语言运行库抛出的AccessViolationException异常不会由catch结构化异常处理程序中语句处理,须要在方法前添加HandleProcessCorruptedStateExceptionsAttribute特性。安全

二、属性的get中调用栈的东西

  若是属性的get方法中使用了调用栈的东西,可能会出现调用栈异常,最好变成方法(在编程建议中,get和set中不该该进行复杂的逻辑判断)。lua

  如得到时间间隔的属性:spa

private long startRecordTime;
public double RecordInterval
{
    get
    {
        double interval = 0;
        try
        {
            long tick = DateTime.Now.Ticks;
            if (startRecordTime <= 0)
            {
                startRecordTime = DateTime.Now.Ticks;
            }
            interval = TimeSpan.FromTicks(tick - startRecordTime).TotalSeconds;
        }
        catch (Exception ex)
        {
            interval = 0;
        }
        return interval;
    }
}

  在调用属性时,序列化可能会出现:“Cannot evaluate expression because a native frame is on the top of the call stack”问题。该异常与AccessViolationException相似,没法使用常规的try…catch捕捉到。.net

相关文章
相关标签/搜索