算术运算中的上溢或下溢

Posted

技术标签:

【中文标题】算术运算中的上溢或下溢【英文标题】:Overflow or underflow in the arithmetic operation 【发布时间】:2014-05-02 14:22:30 【问题描述】:

我是 C# 新手。我得到了这个例外 在我的程序结束时:

An unhandled exception of type 'System.ArithmeticException' occurred in mscorlib.dll

Additional information: Overflow or underflow in the arithmetic operation.

If there is a handler for this exception, the program may be safely continued.

引发此异常的行似乎与任何算术无关 操作 - 实际上我认为这是我的程序的最后一行,例如,当它试图存在时。

我真的不知道出了什么问题。有没有办法解决这个问题?

ps。调用栈:

>   mscorlib.dll!double.IsPositiveInfinity(double d) + 0xc bytes    
    PresentationFramework.dll!System.Windows.Window.ValidateTopLeft(double length) + 0x25 bytes 
    PresentationFramework.dll!System.Windows.Window.CoerceTop(System.Windows.DependencyObject d, object value) + 0x64 bytes 
    WindowsBase.dll!System.Windows.DependencyObject.ProcessCoerceValue(System.Windows.DependencyProperty dp, System.Windows.PropertyMetadata metadata, ref System.Windows.EntryIndex entryIndex, ref int targetIndex, ref System.Windows.EffectiveValueEntry newEntry, ref System.Windows.EffectiveValueEntry oldEntry, ref object oldValue, object baseValue, object controlValue, System.Windows.CoerceValueCallback coerceValueCallback, bool coerceWithDeferredReference, bool coerceWithCurrentValue, bool skipBaseValueChecks) + 0x55 bytes   
    WindowsBase.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.EntryIndex entryIndex, System.Windows.DependencyProperty dp, System.Windows.PropertyMetadata metadata, System.Windows.EffectiveValueEntry oldEntry, ref System.Windows.EffectiveValueEntry newEntry, bool coerceWithDeferredReference, bool coerceWithCurrentValue, System.Windows.OperationType operationType) + 0x247 bytes   
    WindowsBase.dll!System.Windows.DependencyObject.CoerceValue(System.Windows.DependencyProperty dp) + 0xd5 bytes  
    PresentationFramework.dll!System.Windows.Window.SetupInitialState(double requestedTop, double requestedLeft, double requestedWidth, double requestedHeight) + 0x135 bytes   
    PresentationFramework.dll!System.Windows.Window.CreateSourceWindow(bool duringShow) + 0x30b bytes   
    PresentationFramework.dll!System.Windows.Window.CreateSourceWindowDuringShow() + 0xa bytes  
    PresentationFramework.dll!System.Windows.Window.SafeCreateWindowDuringShow() + 0x3f bytes   
    PresentationFramework.dll!System.Windows.Window.ShowHelper(object booleanBox) + 0x77 bytes  
    WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs) + 0x56 bytes 
    WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(object source, System.Delegate method, object args, int numArgs, System.Delegate catchHandler) + 0x3a bytes    
    WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeImpl() + 0xac bytes  
    WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(object state) + 0x38 bytes 
    mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0xa7 bytes  
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x16 bytes  
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x41 bytes    
    WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Invoke() + 0x5b bytes  
    WindowsBase.dll!System.Windows.Threading.Dispatcher.ProcessQueue() + 0x16b bytes    
    WindowsBase.dll!System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) + 0x5a bytes 
    WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) + 0x9b bytes    
    WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) + 0x6b bytes    
    WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs) + 0x56 bytes 
    WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(object source, System.Delegate method, object args, int numArgs, System.Delegate catchHandler) + 0x3a bytes    
    WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs) + 0x10e bytes 
    WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam) + 0xf1 bytes 
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) + 0xae bytes  
    WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) + 0x49 bytes  
    WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4b bytes  
    PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore) + 0x17 bytes  
    PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window) + 0x6f bytes 
    PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window) + 0x26 bytes 
    PresentationFramework.dll!System.Windows.Application.Run() + 0x1b bytes 
    CardReaderGui.exe!CardReaderGui.App.Main() + 0x59 bytes C#
    [Native to Managed Transition]  
    [Managed to Native Transition]  
    mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6b bytes    
    Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x27 bytes  
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x6f bytes   
    mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0xa7 bytes  
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x16 bytes  
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x41 bytes    
    mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes   
    [Native to Managed Transition]  

【问题讨论】:

发布您的代码,否则我们将无法提供帮助。 @Bobson:我明白了,但这就是问题所在,项目很大,当然我不能在这里发布整个项目,而且我不知道代码的哪一部分可能出错了:/ 可以设置VS在异常发生时中断。 Debug -> Exceptions,然后选择 Common Language Runtime Exceptions -> System -> System.ArithmeticException 下的一项。然后,您可以在堆栈跟踪中断时发布堆栈跟踪和与堆栈跟踪相关的代码。 @Josh:请查看我的堆栈跟踪问题(如果我正确复制了它)。另外我怎样才能找到与堆栈跟踪相关的代码??? 你在使用 WPF 吗?看起来与此相关:***.com/questions/2407040/… 【参考方案1】:

这是一个“令人烦恼的异常”,一个检查 Infinity 的方法怎么会导致溢出呢?当然,不可能有比 Infinity 更大的浮点值。只有巴斯光年才能到达无限远。请注意,您不是在编写 Windows 窗体应用程序,堆栈跟踪显示 WPF 代码,与此类问题非常相关。

您在这里处理的是一个硬件异常。浮点处理器引发的异常。此类异常被 CLR 捕获并作为托管异常 A System.ArithmeticException 重新引发。

当您运行托管代码时,这不应该发生。但是,如果浮点处理器未在与托管代码兼容的模式下运行,可能会发生。特别是,浮点单元控制字中的异常掩码已从其预期值更改。这非常可能会在 WPF 应用程序中造成问题,它喜欢使用 NaN 作为窗口坐标。

这是由您的进程中运行的非托管代码引起的。最有可能使用 Borland C 运行时库的代码,这是一个著名的麻烦制造者。您将需要找到该代码并将其删除。如果您对程序中使用的内容没有很好的了解,那就不容易了。并且很难找到此类代码是否被注入到您的进程中,例如当您使用其中一个 shell 对话框(如 OpenFileDialog)时加载的 shell 扩展处理程序。

启用非托管调试和 Debugger + Windows + Modules 窗口对于获得第一线索很重要。确保您可以考虑在该窗口中看到的每个 DLL,特别注意没有 Microsoft 版权声明的 DLL。 SysInternals 的 Process Monitor 也很有帮助。祝你好运狩猎蛇。

【讨论】:

Borland 运行时是我的罪魁祸首,一旦我绕过它,WPF 就对我的窗口坐标感到满意,否则它会为有效坐标抛出此异常。 分析得很明智,汉斯!非常感谢。这里有类似的麻烦。我试图通过 Borland/Codegear C++ Builder 2007 应用程序中的 C++/CLI Bridge-DLL 打开 WPF 窗口。我可以通过在 .NET 世界中调用 _controlfp(0x9001F, 0xFFFFF) 来避免异常,但我不知道问题到底出在哪里。【参考方案2】:

除了 Hans Passant 非常有启发性的回答之外,我还找到了一个对我有用的相对简单的解决方案。我遇到了一个非常相似的错误,它只发生在大约五分之一的计算机上。重新安装Visual C++ Redistributable for Visual Studio 2012 Update 4 解决了这个问题。

请注意,这也适用于没有安装 Visual Studio 的计算机。

【讨论】:

【参考方案3】:

我知道评论这个问题已经太晚了,但我的情况是,我在使用服务中的数据库上下文作为该服务的属性时遇到了这个错误

  public class XService : System.IDisposable
        
         private SiactDbContext db = new SiactDbContext();
    

 public long SaveObject (TypeX object) //In this method the error
        
            long result = -1;
           
            try
            
                db.TypeX.Add(object);
                db.SaveChanges();
                result =  retencion.id;
            
            catch (Exception e)
            
                Log.Error("Error to saving object");
                Log.Error(e.InnerException.Message);
                Log.Error(e.StackTrace);

            
       
            return result;
        

在我在方法中使用 dbContext 私有后,打开并处理它就可以了。

这样

public long SaveObject (TypeX object)
        
            long result = -1;
            SiactDbContext db1 = new SiactDbContext();

            try
            
                db1.TypeX.Add(object);
                db1.SaveChanges();
                result =  object.id;
            
            catch (Exception e)
            
                Log.Error("Error to saving object");
                Log.Error(e.InnerException.Message);
                Log.Error(e.StackTrace);

            
            db1.Dispose();

            return result;
        

【讨论】:

也许在你的 try/catch 中添加一个 finally 并将 dispose 放在那里 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 只是让我知道:为什么不使用 StackTrace 记录 e.ToString() 而不是 InnerException.message? AFAIK e.ToString() 打印所有异常消息和调用堆栈:)

以上是关于算术运算中的上溢或下溢的主要内容,如果未能解决你的问题,请参考以下文章

计算没有上溢或下溢的 3D 欧几里得距离

javascript算术溢出

Java中的算术运算符

Python中的算术运算符都有哪些呢?

shell脚本中的算术运算和条件测试语句

Python3中的算术运算符