从代理返回异常

2024-01-10

我正在使用大量未记录的 Castle 动态代理系统。我已经设法让它完成我想要的几乎所有事情,除了一件事:如何使代理方法抛出异常而不是返回值?

public sealed class MyInterceptor : IInterceptor
{
  public void Intercept(IInvocation invocation)
  {
    if (CheckArgs(invocation.Arguments))
    {
      invocation.ReturnValue = DoRealWork(invocation.Arguments);
    }
    else
    {
      invocation.Exception = new InvalidOperationException(); // How?
    }
  }
}

从被代理对象的角度来看,拦截器是不可见的;它只是调用自己的虚拟方法,DynamicProxy 在返回之前调用正确的拦截器方法ReturnValue给来电者。

因此,如果你想抛出异常,只需从拦截器中抛出即可:

if (CheckArgs(invocation.Arguments))
{
  invocation.ReturnValue = DoRealWork(invocation.Arguments);
}
else
{
  throw new InvalidOperationException();
}

从调用者的角度来看,这将是被调用方法中的异常。

编辑评论:

关于生成器中抛出的异常的类型,我有正确的类型,而不是包装器:

public interface IDummy
{
    string DoSomething();
}

public class Dummy: IDummy {
    public virtual string DoSomething()
    {
        return string.Empty;
    }
}

public class MyCustomException : Exception {}

public class CustomIntercept: IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        throw new MyCustomException();
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var pg = new ProxyGenerator();
        GetValue(pg.CreateInterfaceProxyWithoutTarget<IDummy>(new CustomIntercept()));
        GetValue(pg.CreateClassProxy<Dummy>(new CustomIntercept()));
        GetValue(pg.CreateClassProxyWithTarget<Dummy>(new Dummy(), new CustomIntercept()));
        GetValue(pg.CreateInterfaceProxyWithTarget<IDummy>(new Dummy(), new CustomIntercept()));
    }

    private static void GetValue(IDummy dummy)
    {
        try
        {
            dummy.DoSomething();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.GetType().Name);
        }
    }
}

所有四个输出都是MyCustomException

您能否确保 TargetInitationException 不是来自您自己的代码?您使用的是哪个版本的DynamicProxy(我使用的是Castle.Core 3.2中的版本)

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

从代理返回异常 的相关文章

随机推荐

  • 连接顺序如何影响查询性能

    我在查询中遇到了时间性能的巨大差异 并且查询中连接 内部和左外部 发生的顺序似乎造成了所有差异 是否有一些 基本规则 应按什么顺序加入 它们都是更大查询的一部分 它们之间的区别在于左连接在更快的查询中放在最后 慢查询 gt 10分钟 SEL
  • 在 EditorFor 和 DisplayFor 之间切换

    我有一个部分视图 它设置为显示数据库记录的表 网格 我可以轻松地让它显示该行的显示或编辑器模板 但是如何从displayFor to editorFor当我单击并编辑或保存链接时 div div class divQuestionItems
  • 将 JSON 字符串转换为 Lua 表?

    我需要将 Json 字符串转换为 Lua 中的表数据结构 我正在使用以下代码 local json require json local t name1 value1 name2 1 false true 23 54 a 021 strin
  • 防止传单 R-Map 缩小?

    我用传单 R 包制作了传单地图 This is what the result looks like 我对此非常满意 但是当我将其嵌入网站并用笔记本电脑向下滚动文章时 我经常会不小心缩小地图 然后看起来像这样 用户也必须放大才能看到地图上有
  • 覆盖 SharePoint 2010 中的 X-UA 兼容元

    我正在使用 SharePoint 2010 我想使用对于特定页面 母版页将其设置为 IE 8 这不允许我在 CSS 中使用 box shadow 例如 我无权访问母版页来更改它 我还读到 不建议更改母版页中的元 因为它可能会导致日历等其他内
  • 读取 NetworkStream 不会推进流

    我有一个客户端 服务器应用程序 其中服务器传输一个 4 字节整数 指定下一次传输的大小 当我在客户端读取 4 字节整数 指定 FILE SIZE 时 下次读取流时 我会读取 FILE SIZE 4 个字节 从此流读取时是否需要将偏移量指定为
  • python 和 numpy 中的随机数生成器是什么?

    import random import numpy random 算法是什么random and numpy random 通常Mersenne Twister是matlab的默认生成器 并且可以选择使用哪个生成器 python 呢 有随
  • 在 AS3 中创建自定义 Trace() 类

    我想到了扩展我的trace 消息 Why trace 遍布我的代码 我想通过一个简单的命令打开 关闭它们 并且可能向trace 添加某种优先级功能 即 myTrace TraceMsg loosehere debugme 0 myTrace
  • 为什么 Google App Engine 在登录期间附加到我的“继续”位置的路径?

    我正在使用 Greasemonkey 脚本中的一个非常简单的 GAE 实例 这在过去几个月工作得很好 但现在一条路径被附加到最终的 继续 位置 这破坏了我的登录过程 基本工作流程 假设用户已登录其 Google 帐户 但其 GAE 实例的令
  • Typescript Node.js 应用程序中的 guid/uuid

    我尝试做一个uuid v 3 0 1 包在 Node Typescript 应用程序中工作 但我不确定应该导入什么以及如何使用它 This is index d ts from types uuidv 2 0 29 declare name
  • SPOJ 370 - 一和零 (ONEZERO)

    我正在尝试解决SPOJ 问题 1 和 0 http www spoj com problems ONEZERO 某些正整数的十进制表示仅由 1 和 0 组成 并且至少有一位数字 1 例如101 如果一个正整数不具有这样的性质 可以尝试将它乘
  • 使工具栏按钮样式应用于工具栏中的用户控件

    如何强制 WPF 中 ToolBar 内的 UserControls 使用 ToolBar 的默认按钮样式 我有一个名为 ImageButton 的简单用户控件 它的 XAML 如下所示
  • 只允许某些网站访问 PHP API

    我目前面临着保护客户在其网站上使用的 API 安全的问题 然而 因为这个 API 是由 JavaScript 调用的 所以我发现很难找到一种方法来只允许这些访问 API URL 那么我该怎么办呢 我如何只允许访问这些链接 显然 链接可能会受
  • 如何为 Rails 设置远程 json API 以进行身份​​验证和会话

    我是 Rails 新手 对 Devise Gem 有相当基本的了解 除了 CRUD 和视图之外 我不清楚它提供了什么可以帮助我让 AngularJs 应用程序与 Rails Json Api 进行对话 目前我正在用手滚动东西 为了安全起见
  • 列表框插入颜色项目

    I use ListBox用于插入文本 例如You add Michael in your database You delete Michael listBox1 Items Insert 0 You add name in your d
  • appcelerator titan:创建一个新文件

    如何在 appcelerator titan 中创建新文件 var Settings Titanium Filesystem getFile Titanium Filesystem tempDirectory Settings Ti API
  • 如何通过HardHat获取底层合约地址的私钥?

    我有 HardHat 教程中的智能合约https hardhat org tutorial writing and compiling contracts html https hardhat org tutorial writing an
  • Google Deployment Manager Cloud Scheduler 类型

    我发现 GCP 没有提供时间表类型 我想知道创建模板 复合类型或类似模板以提供 Cloud Scheduler 类型的步骤 我知道 Google 已经提供了一个例子 https github com GoogleCloudPlatform
  • 无法使用运行 MAMP / PHP 5.6.1 / Mac OS X El Capitan 的 putenv() 修改 PATH

    配置 MAMP专业版 PHP 5 6 1 Mac OS X 埃尔卡皮坦 我需要添加 user local binphp可以访问的系统路径 我尝试过使用 putenv 但似乎我无法使用 putenv 更改 php 中环境变量 PATH 的值
  • 从代理返回异常

    我正在使用大量未记录的 Castle 动态代理系统 我已经设法让它完成我想要的几乎所有事情 除了一件事 如何使代理方法抛出异常而不是返回值 public sealed class MyInterceptor IInterceptor pub