例如,我很好奇如果在下面的代码中,我可以确定 Foo() 或 Bar() 将被执行。
try {
... // Assume there is no return statement here
Foo();
} catch (Exception e) {
Bar();
}
我对 finally block 非常熟悉,不需要解释该功能。
我问是因为上面的代码不能在 Java 中工作,因为 Throwable 的存在,这是我通过艰难的方式发现的。
最佳答案
还有停止应用程序的“烧毁房屋”方法:
Environment.Exit(int code);
Environment.FailFast(string message);
Thread.CurrentThread.Abort();
AppDomain.Unload(AppDomain.CurrentDomain);
为了好玩,这里还有一个:)
[DllImport("kernel32.dll",SetLastError = true)]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
byte [] lpBuffer,
uint nSize,
out UIntPtr lpNumberOfBytesWritten);
var myProcess = Process.GetCurrentProcess();
var hProcess = myProcess.Handle;
var rnd = new Random();
while(true)
{
var writeTo = new IntPtr((int)rnd.Next(0, int.MaxValue));
var toWrite = new byte[1024];
UIntPtr written;
WriteProcessMemory(
hProcess,
writeTo,
toWrite,
(uint)toWrite.Length,
out written);
}
出于好奇和刺激,让我们试驾一下吧!
我们的测试平台:
static void Main(string[] args)
{
Trace.Listeners.Add(new ConsoleTraceListener());
AppDomain.CurrentDomain.UnhandledException += OnNoes;
try
{
// INSERT BURN STATEMENT
Foo();
}
catch (Exception e)
{
Bar();
}
finally
{
Baz();
}
}
static void Foo()
{
Trace.WriteLine("I AM FOO!");
}
static void Bar()
{
Trace.WriteLine("I AM BAR!");
}
static void Baz()
{
Trace.WriteLine("I AM BAZ!");
}
static void OnNoes(object sender, UnhandledExceptionEventArgs e)
{
Trace.WriteLine("OhNoes!");
}
结果!
燃烧声明:
Thread.CurrentThread.Abort();
输出:
I AM BAR!
I AM BAZ!
燃烧声明:
AppDomain.Unload(AppDomain.CurrentDomain);
输出:
I AM BAR!
I AM BAZ!
燃烧声明:
Environment.Exit(-1);
输出:
Nothing! No trace output at all!
燃烧声明:
Environment.FailFast("Burn!!!");
输出:
Application crash! A FatalExecutionEngineError was thrown,
which was not caught by any block/handler. No trace output.
就这样吧!什么?我错过了一个?
燃烧声明:
Splode();
“Splode”在哪里:
static void Splode()
{
var myProcess = Process.GetCurrentProcess();
var hProcess = myProcess.Handle;
var rnd = new Random();
while (true)
{
var writeTo = new IntPtr((int)rnd.Next(0, int.MaxValue));
var toWrite = new byte[1024];
UIntPtr written;
WriteProcessMemory(
hProcess,
writeTo,
toWrite,
(uint)toWrite.Length,
out written);
}
}
输出:
Application crash! A FatalExecutionEngineError was thrown,
which was not caught by any block/handler. No trace output.
Crashed Visual Studio while running attached!
关于c# - 异常和返回语句是 C# 中唯一可能的提前退出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15259428/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha