是否有可以容忍运行时错误的编程语言?

时间:2010-10-31 04:39:55

标签: programming-languages

是否存在可以使用以下输入的编程语言:

m = 1;
n = 2/0;
print(n);
print(m);

并在屏幕上成功打印“1”?

该语言的成熟度和实施质量无关紧要。

编辑:不要从字面上理解问题。我对于除以0不感兴趣。我试图找到一种对(几乎)所有运行时错误都不敏感的语言。

7 个答案:

答案 0 :(得分:6)

Visual Basic:On Error Resume Next

我想指出的是,大多数语言都可以使用语言允许连接到中断的任何关键字来处理上述内容。

答案 1 :(得分:2)

[编辑]

好的,在OP的编辑之后,似乎我完全误解了这个问题。然而,我仍然在这里留下我的答案,因为有人可能会从中获得一些新的信息,无论如何删除它都没有用处。


采用像Haskell这样的懒惰语言。定义print以使其tries打印该值,忽略打印时发生的任何错误。而且你有它,一种行为与你的问题中描述的一样的语言。

Scala中的代码示例:

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import util.control.Exception._
import util.control.Exception._

scala> def print[A](x: => A) {
     |   ignoring(classOf[Exception]) {
     |     println(x)
     |   }
     | }
print: [A](x: => A)Unit

scala> lazy val m = 1
m: Int = <lazy>

scala> lazy val n = 2 / 0
n: Int = <lazy>

scala> print(n)

scala> print(m)
1

(注意:默认情况下,Scala不是一种惰性语言,但可选择支持惰性语义)

答案 2 :(得分:1)

在Mathematica中,您不需要错误捕获命令

Pgm:

Off[General::infy] (*Turn off infinity error messages*)  
m = 1;  
n = 2/0;    
Print[n];     
Print[m];  

输出:

ComplexInfinity
1

如果省略第一行(错误抑制命令),则会打印其他警告消息:

Power::infy: Infinite expression 1/0 encountered. >>

此外,您可以使用n:

的“ComplexInfinity”值进行操作
 Print[1/n]  

给出

 0

答案 3 :(得分:1)

使用IEEE 754浮点运算的任何语言。除以零是无限。

例如在Javascript中:

> 1/0
Infinity

答案 4 :(得分:0)

很多年前,我们学校的COBOL老师曾经说'COBOL是唯一允许除零的编程语言'(没有给出运行时错误)。

答案 5 :(得分:0)

如果您尝试执行非法操作,依赖类型的编程语言(如Idris,Agda或Coq)将无法编译。以下是您在Idris中的代码的安全示例。

safeDivide : Nat -> (y:Nat) -> so (y /= 0) -> Nat
safeDivide x y p = div x y

main : IO ()
main = 
  print (show 1)   -- compiles successfully
  print (show (safeDivide 2 1 oh))   -- compiles successfully
  -- print (show (safeDivide 2 0 oh))   -- throws an error at compile time

依赖类型语言允许您编写校样,以便其类型系统可以验证您的代码是否按预期方式工作。通过使用证明(safeDivide)定义so (y /= 0,您可以保证,如果0传播到此函数,您的程序甚至无法编译。

答案 6 :(得分:0)

Bourne Shell:

M=1
N=expr 2 / 0
echo $N
echo $M