我什么时候想要恢复 Perl 6 异常?

2024-03-26

也许我真正的问题是“这个功能是否适合学习 Perl 6“? 基于这个 Perl 6 CATCH 块应该能够更改词法范围内的变量吗? https://stackoverflow.com/q/43289842/2766176,看起来最简单的例子可能超出了简单的例子。

在这个问题中,我正在处理一些看起来很愚蠢的东西,或者更好地以另一种方式解决该特定问题,因为我正在使用该功能而不是解决问题。

有记录使用警告作为特殊类型的异常(“控制异常”),您可以在其中获取消息,如果您愿意,可以捕获它,但也可以忽略它,它会自行恢复(尽管我对此相当愚蠢)在我应该在哪里捕获 Perl 6 警告控制异常? https://stackoverflow.com/q/43243412/2766176).

除此之外,我正在考虑调用者可以处理被调用者范围之外的故障的事情。例如,重新连接到数据库、修复丢失的目录以及被调用者不负责的其他外部资源问题。

在阅读其他语言的此类内容时,建议大多是不要使用它们,因为在“现实世界”编程中,人们往往不会真正处理问题。

答案是C# 异常处理程序继续下一步 https://stackoverflow.com/a/42202288/2766176似乎是说这是糟糕的实践和丑陋的代码。我当然还没有找到在被调用者中隐藏一堆代码的方法。

我修改了这个例子,尽管我不相信这是一个好方法,也不值得推荐给初学者。程序启动时会查找 PID 文件。如果找到,就会抛出异常。处理该异常会检查另一个实例是否仍在运行,这可能会引发不同类型的异常。并且,还有一个可以处理文件 IO 问题的工具。诀窍是X::MyProgram::FoundSemaphore如果其他程序没有运行(但留下了其 PID 文件),则可以恢复。

class X::MyProgram::FoundSemaphore is Exception {
    has $.filename;
    has $.this-pid = $*PID;
    has $.that-pid = $!filename.lines(1);

    method gist {
        "Found an existing semaphore file (pid {.that-pid})"
        }
    }

class X::MyProgram::StillRunning is Exception {
    has $.that-pid;
    has $.os-error;

    method gist {
        "This program is already running (pid {self.that-pid})"
        }
    }

class X::MyProgram::IO::OpenFile is Exception {
    has $.filename;

    method gist {
        "This program is already running (pid {self.that-pid})"
        }
    }

sub create-semaphore {
    state $filename = "$*PROGRAM.pid";
    END { unlink $filename }

    die X::MyProgram::FoundSemaphore.new(
        :filename($filename)
        ) if $filename.IO.e;

    my $fh = try open $filename, :w;

    # open throws Ad::Hoc, which could be more helpful
    die X::MyProgram::IO::OpenFile.new(
        :filename($filename),
        :os-error($!),  # role X::IO-ish
        ) unless $fh;

    $fh.print: $*PID;
    }

BEGIN {
    try {
        CATCH {
            when X::MyProgram::FoundSemaphore {
                my $proc = run qqw/kill -0 {.that-pid}/;
                X::MyProgram::StillRunning.new(
                    :that-pid(.that-pid) ).throw
                    if $proc.so; # exit code is 0, so, True
                unlink .filename;
                .resume;
                }
            default { say "Caught {.^name}"; exit }
            }

        create-semaphore();
        }
    }

sub MAIN ( Int $delay = 10 ) {
    put "$*PID sleeping for $delay seconds";
    sleep $delay;
    }

可恢复异常当然不是我在 Perl 6 中所追求的。我认为我还没有在“用户空间”代码中使用过它们。事实证明,可恢复异常是实现该方法的正确方法emit函数,用于supply and react块。这take函数用于gather也是使用可恢复异常来实现的,并且 - 正如您已经发现的 -warn使用它们。

我怀疑最后一个 -warn- 是典型 Perl 6 用户感兴趣的唯一情况。捕获警告并将其发送到其他地方(可能发送到日志文件或日志服务器)是一件相当合理的事情。就学习 Perl 6 而言,这可能是可恢复异常明显有用的示例。

我认为重要的是,所有利用 Perl 6 本身中可恢复异常的用例都被归类为“控制异常”。控制异常本质上是实现级别的正常异常:它们涉及非本地控制转移。它们在语言级别上是不同的,因为如果您使用 Perl 6,那么使用 Perl 6 会相当尴尬。emit, take, warn, next, last等等停止工作,因为CATCH块与default吞掉控制异常!

然而,这也有点“照我说的做,而不是照我做的做”:虽然 Perl 6 很乐意使用异常系统来实现非本地流控制,但它在某种程度上将其隔离在语言的一个尘土飞扬的角落,而不是而不是拿它作为要做某事的例子。这是有充分理由的:通常,使用异常进行流程控制的代码很难理解,而对于可恢复的异常来说,情况会加倍。另一个巨大的风险是,此类异常可能会被使用裸露的代码所吞没。try or a CATCH with a default- 使其在更大的代码库中变得相当脆弱。

我想可恢复异常的最佳用途将是作为用户根本不会考虑异常的事情的实现策略 - 就像以下情况一样take and emit(而且,大多数时候,warn)。并且,与可恢复异常的现有示例一样,正在恢复的事物将是专门设计用于在可恢复情况下引发的异常类型,并且仅在明智的情况下使用。然而,在 Perl 6 提供一种定义自定义控件异常的方法之前,我不愿意这样做;这try/default吞咽问题使其变得太脆弱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候想要恢复 Perl 6 异常? 的相关文章

  • “sys.excepthook”和线程

    我正在使用Python 2 5并尝试使用自定义excepthook在我的程序中 在主线程中它工作得很好 但在以线程模块启动的线程中 通常excepthook叫做 这是一个显示问题的示例 取消注释该注释会显示所需的行为 import thre
  • Laravel 5 重写异常处理程序

    我想知道是否可以重写 Laravel 5 中的应用程序异常处理程序类 而不将其扩展到另一个类 也许更好的说法是我想要它 这样就不会App Exceptions Handler将在异常时调用 但是我自己的处理程序之一 提前致谢 正如 Digi
  • 在现代 Perl 中编写异常类的最佳实践

    With Exception Class https metacpan org pod Exception Class 我可以将异常定义为类 并且一旦将它们加载到任何地方 它们就可以在任何地方使用 但是很多地方 包括 E C 本身的文档 都
  • @ControllerAdvice 未触发

    我正在开发 Spring MVC Webflow 应用程序 版本 3 2 并尝试进行异常处理 我可以将自定义异常消息输出到日志文件和 error jsp 我遇到的问题是异常处理程序没有被解雇 我创建了以下类并对其进行了注释 Controll
  • 抛出旧异常的同时抛出新异常

    如果在由异常引起的堆栈展开期间 C 中的析构函数抛出异常 则程序将终止 这就是为什么析构函数永远不应该在 C 中抛出 示例 struct Foo Foo throw 2 whoops already throwing 1 at this p
  • Xunit 中的测试异常 ()

    我正在尝试对此方法编写 Xunit 测试 public async Task
  • Laravel 5 Blade 在出现错误时显示空白页而不是抛出异常

    在 laravel 4 中 当你尝试渲染一个不存在的视图时应用程序 视图或者带有未定义变量的视图 laravel 将抛出异常或显示有助于调试的错误 我全新安装了 laravel 5 0 13 并且在对刀片模板进行故障排除时遇到了困难 该模板
  • 为什么我不能在 Java 8 lambda 表达式中引发异常? [复制]

    这个问题在这里已经有答案了 我升级到 Java 8 并尝试用新的 lamdba 表达式替换通过 Map 的简单迭代 该循环搜索空值 如果找到则抛出异常 旧的 Java 7 代码如下所示 for Map Entry
  • .net Web 应用程序中的异常处理

    我承认 我不关心太多的异常处理 我知道我应该做得更多 但我永远不知道从哪里开始和从哪里停止 我并不懒惰 离得很远 这是因为我对异常处理的矛盾心理感到过度紧张 即使是最小的应用程序中 似乎也有无数个地方可以应用异常处理 但它可能会让人感觉有点
  • JavaFX:无法设置绑定值异常

    在我的 javafx 应用程序中 我创建了一个表视图 其中有一些项目 如果项目存在于表视图中 则应启用删除按钮 否则应禁用删除按钮 现在的问题是 当我选择项目并单击删除按钮时 它会引发以下异常 我该如何解决这个问题 这是我的表格视图代码 t
  • 多种形式的异常处理

    当我调试时与运行编译的 exe 时 我看到不同的行为 异常被捕获或未被捕获 我有两个表格 Form1 和 Form2 Form1 上有一个按钮 用于实例化并调用 Form2 上的 ShowDialog Form2 上有一个按钮 故意产生除以
  • Android JNI异常处理

    我需要在 JNI 代码中实现异常处理 我不擅长 jni 找不到任何好的例子 因此 请提供完整的示例 这就是我正在做的 jint JNI OnLoad JavaVM vm void reserved jint result 1 g JavaV
  • 当 Django 在 postgresql 中使用可序列化事务隔离级别时,哪些具体异常代表序列化失败?

    有时 对于 Django 中的数据库操作 需要使用比默认 已提交读 更高的隔离级别 文档警告 https docs djangoproject com en 1 11 ref databases isolation level that 在
  • 如何处理过时的连接?

    我们的应用程序是一个 J2EE 应用程序 在 Websphere 6 1 上通过 Mainframe DB2 后端使用 Struts EJB Hibernate 最近已投入生产 我们收到过时的连接异常当用户第一次或有时登录应用程序时 此异常
  • 为什么这段代码会抛出 InvalidOperationException?

    我认为我的代码应该使ViewBag test财产等于 No Match 但它会抛出一个InvalidOperationException 为什么是这样 string str Hello1 Hello Hello2 string anothe
  • 何时捕获 java.lang.Error?

    在什么情况下应该抓住java lang Error在申请上 一般来说 永远不会 但是 有时您需要捕获特定的错误 如果您正在编写类似框架的代码 加载第 3 方类 那么最好抓住LinkageError 未找到类定义 链接不满足 类更改不兼容 我
  • Perl 6:反式(%h) 与反式(%h.keys => %h.values)

    还有一个问题是关于hash作为论据trans 在下面的代码中简单地取hash给出了错误的结果 但将其替换为keys and values使其正确 怎么了 my alph1
  • 在 C++ 中重用异常处理代码

    我有这两个函数 具有重复的异常处理 其唯一目的是显示错误消息 void func1 noexcept try do task do another task catch const std out of range e show msg O
  • 捕获通信异常而不是自定义故障异常 - WCF

    在服务器上我抛出这样的异常 catch SqlException exception if exception Message Contains Custom error from stored proc Exception to be t
  • UnhandledException 事件不起作用?

    我正在编写一个小库 它捕获所有未处理的异常 显示一个小对话框 类似于 NF 的常见对话框 使用户有机会将异常发送给开发人员 为此 我使用 AppDomain 的 UnhandledException Event 如下所示 app Unhan

随机推荐