Revit SDK:ErrorHandling

news2024/11/25 14:32:34

前言

本文介绍 Revit 的错误处理机制。

内容

程序员对错误处理的定义和理解

程序的错误处理机制可以分为两种类型:错误返回码和异常捕捉。

错误返回码是指在程序中遇到错误时,通过函数返回值来表明错误的类型和信息。错误返回码可以在程序中被预测和处理,但是需要开发者在每个函数中都进行判断和处理,增加了代码的复杂度和冗余。此外,错误返回码只能在同步编程中使用,对于异步编程则无法发挥作用。

异常捕捉则是指在程序中遇到错误时,通过抛出异常来表明错误的类型和信息。异常会一直向上层传递,直到被捕捉或者程序崩溃。异常捕捉可以大大减少代码的复杂度和冗余,同时也能够在异步编程中发挥作用。

不同类型的软件可能有不同的错误处理机制,但是错误返回码和异常捕捉都是常见的处理方式。除此之外,一些软件还会采用日志记录、告警通知等方式来处理错误。错误处理机制的选择主要取决于具体的应用场景和需求。

Revit API 中错误处理机制

从日常的编码过程中,Revit API 在出错的时候是会抛出异常的,并且提供机会让用户自己来处理异常。因此,可以认为 Revit API 中的错误处理机制包含了异常。同时,Revit API 也内置了多种错误码,因此也可以认为它是有错误返回嘛的。
从 Revit 官网可以查到它的错误处理机制:Failure Posting and Handling
在Revit API 中,错误包含两种类型,一种是Revit自带的错误,另外一种是用户定义的错误。前者,系统会自动抛出;后者,需要通过 Revit API 定义。

SDK例子中的错误处理

抛出一个 Warning 并在 FailurePreproccessor 中处理

下面两段代码都是抛出一个 Warning 并在 FailurePreproccessor 中处理,差别在于一个是主动抛出,另一个是让墙体重合,让 Revit 自动抛出。重点注意,事务Transaction 有接口用来设置错误处理Transaction.SetFailureHandlingOptions,传入的参数为 FailureHandlingOptions 。而 FailureHandlingOptions 可以设置前置错误处理 FailureHandlingOptions.SetFailuresPreprocessor

在这里插入图片描述

// 主动抛出 warning,并在FailurePreprocessor中处理
string message = "";
try
{
	Transaction transaction = new Transaction(m_doc, "Warning_FailurePreprocessor");
	FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
	FailurePreprocessor preprocessor = new FailurePreprocessor(); 
	options.SetFailuresPreprocessor(preprocessor);
	transaction.SetFailureHandlingOptions(options);
	transaction.Start();
	FailureMessage fm = new FailureMessage(m_idWarning);
	m_doc.PostFailure(fm);
	transaction.Commit();
}
catch(System.Exception)
{
	message = "Failed to commit transaction Warning_FaiurePreprocessor";
	return Result.Failed;
}

// 墙体重合,Revit 自动抛出warning,并在FailurePreprocessor中处理
try
{
	Transaction transaction = new Transaction(m_doc, "Warning_FailurePreproccessor_OverlappedWall");
	FailureHandlingOptions options = transaction.GetFailureHandlingOptions();
	FailurePreprocessor preproccessor = new FailurePreprocessor();
	options.SetFailuresPreprocessor(preproccessor);
	transaction.SetFailureHandlingOptions(options);
	transaction.Start();

	// 在相同的位置创建两堵墙
	Line line = Line.CreateBound(new XYZ(-10, 0, 0), new XYZ(-20, 0, 0));
	Wall wall1 = Wall.Create(m_doc, line, level1.Id, false);
	Wall wall2 = Wall.Create(m_doc, line, level1.Id, false);
	m_doc.Regenerate();

	transaction.Commit();
}
catch (System.Exception)
{
	message = "Failed to commit transaction Warning_FailurePreproccessor_OverlappedWall";
	return Result.Failed;
}

通过 Application 来处理错误

包含两种:使用事件来处理错误,注册回调来处理错误。
在这里插入图片描述

// Autodesk.Revit.ApplicationServices.Application
try
{
	m_revitApp.FailuresProcessing += new EventHandler<Autodesk.Revit.DB.Events.FailuresProcessingEventArgs>(FailuresProcessing);
	Transaction transaction = new Transaction(m_doc, "Error_FailuresProcessingEvent");
	transaction.Start();
	Line line = Line.CreateBound(new XYZ(0, 10, 0), new XYZ(20, 10, 0));
	Wall wall = Wall.Create(m_doc, line, level1.Id, false);
	m_doc.Regenerate();
	FailureMessage fm = new FailureMessage(m_idError);
	FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
	fm.AddResolution(FailureResolutionType.DeleteElements, fr);
	m_doc.PostFailure(fm);
	transaction.Commit();
}
catch (System.Exception)
{
	message = "Failed to commit transaction Error_FailuresProcessingEvent";
	return Result.Failed;
}

try
{
	FailuresProcessor processor = new FailuresProcessor();
	Application.RegisterFailuresProcessor(processor);
	Transaction transaction = new Transaction(m_doc, "Error_FailuresProcessor");
	transaction.Start();
	Line line = Line.CreateBound(new XYZ(0, 20, 0), new XYZ(20, 20, 0));
	Wall wall = Wall.Create(m_doc, line, level1.Id, false);
	m_doc.Regenerate();
	FailureMessage fm = new FailureMessage(m_idError);
	FailureResolution fr = DeleteElements.Create(m_doc, wall.Id);
	fm.AddResolution(FailureResolutionType.DeleteElements, fr);
	m_doc.PostFailure(fm);
	transaction.Commit();
}
catch (System.Exception)
{
	message = "Failed to commit transaction Error_FailuresProcessor";
	return Result.Failed;
}

错误处理的具体内容详见SDK源码。源码中的拼写错误 FailurePreproccessor 多了一个 c,实际为 FailurePreprocessor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据落盘原理(data page、redo log、undo log、binlog、xa-2pc等源码分析)

文章目录 前言一、Innodb如何作为MySQL插件的二、page cleaner thread三、Update操作源码梳理1、生成undo log2、更新数据3、生成redo log 四、MTR与将脏页添加到Flush List1、MTR2、脏页添加到Flush List 五、事务提交1、xa-prepare2、xa-commit2.1、process_flush_stage_queu…

概率统计与计算机技术的联系及在生活当中的应用研究

title: 概率统计与计算机技术的联系及在生活当中的应用研究 date: 2023-05-16 11:42:26 tags: 题目&#xff1a;概率统计与计算机技术的联系及在生活当中的应用研究 摘 要 概率论与数理统计是研究随机现象统计规律性的一门学科&#xff0c;是理工科各专业的一门重要的基础课程…

shell免交互

shell免交互 Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个“文件”并用作“命令”的…

Python 爬虫(四):Selenium 框架

Selenium 是一个用于测试 Web 应用程序的框架&#xff0c;该框架测试直接在浏览器中运行&#xff0c;就像真实用户操作一样。它支持多种平台&#xff1a;Windows、Linux、Mac&#xff0c;支持多种语言&#xff1a;Python、Perl、PHP、C# 等&#xff0c;支持多种浏览器&#xff…

Android中的IPC方式

Android中的IPC方式 1.Bundle 其中Intent就是用Bundle进行传播 四大组件间的进程间通信 2.使用文件共享 2.1文件共享的缺点 无并发&#xff0c;适用于交换简单的数据实时性不高的情景 使用文件共享容易出&#xff1a; 内容不一致&#xff1a;如果多个线程同时写入文件&…

【JavaWeb】-- Request和Response、JSP、会话技术

文章目录 Request和Response1.概述2.Request对象2.1 Request继承体系2.2Request获取请求数据2.3 IDEA创建Servlet2.4 请求参数中文乱码问题POST请求解决方案GET请求解决方案 2.5 Request请求转发 3.Response对象3.1 Response设置响应数据功能介绍3.2 Response请求重定向3.3 路径…

RabbitMQ养成记 (8. 消费者接受消息可靠性 consumer Ack)

Consumer Ack ack 指的是acknowledge 确认&#xff0c; 指的是消费端收到消息后的确认方式。 有三种确认方式&#xff1a; 自动确认手动确认 &#xff08;根据业务情况 手动确认是否成功发送&#xff09;根据异常情况确认 我们在消费端用代码实践一下&#xff1a; 首先我们定…

不会还有人不知道软件测试报告模板怎么写吧?

在测试岗位上&#xff0c;写报告是一项非常重要的软技能&#xff0c;写得好可以加分&#xff0c;写不好必然减分。 但在测试岗位上&#xff0c;提测“通过”和提测“不通过"的软件测试报告所包含的内容是不一样的&#xff08;这是个坑&#xff09;。但很多测试新人可能并…

LIO-SAM UBUNTU16.04.7 ROS-KINETIC 环境 编译 安装

简单记录一下 VMWARE workstation15UBUNTU16.04.7ros-kineticgtsam4.0.0 &#xff08;默认16.04比较老旧&#xff0c;不好用&#xff0c;vmtools也都没有&#xff0c;选了一个.7&#xff09; 选16.04版本的理由也简单&#xff0c;只是为了参考一个博客&#xff0c;单独建的环…

C语言-易错点汇总

易错点汇总 指针数组和数组指针(*p).astruct stdent和typedef struct stdentF5和CtrlF5const的位置全局变量和局部变量两个相同的常量字符串数组名和&数组名数组指针定义的解读int (*arr[10])[5]数组传参(* (void (*)())0)();关于数组名是否表示整个数组和数组首元素的地址…

Java位运算

Java >>和>>>的区别 | 或&#xff1a; 有1得1&#xff0c; 全0得0 int temp a|c;System.out.println(Integer.toBinaryString(a));System.out.println(Integer.toBinaryString(c));System.out.println(Integer.toBinaryString(temp));/*** 结果输出* * 01* …

对比SQL学Python:筛选|条件判断

SQL里筛选数据主要用到了where、and、in等语句。而在Python里实现筛选的方式比较多样&#xff0c;用到了 与&或|非~ 逻辑运算符&#xff0c;和isin()函数等。我们感受一下二者的区别吧&#xff1a; 汇总&#xff1a; 类型Python语句参考单条件筛选 data[data[shop_type]A…

Python复制目录及其子目录下的所有文件到指定新目录并重命名

Python复制目录及其子目录下的所有文件到指定新目录并重命名 前言前提条件相关介绍实验环境Python复制目录及其子目录下的所有文件到指定新目录并重命名代码实现输出结果 前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#x…

最常用的界线矢量数据大合集(文末有附下载方法)

最近收集了挺多比较常用的矢量界线数据&#xff0c;例如地理分区、气候分区等界线数据&#xff0c;在日常制图、学习、科研等方面使用频率比较高。废话不多说&#xff0c;这里给大家分享一下&#xff01;&#xff01; 1、中国农业熟制区划矢量数据 2、黄土高原空间范围矢量数据…

【Leetcode -509.斐波那契数 -520.检测大写字母】

Leetcode Leetcode - 509.斐波那契数Leetcode - 520.检测大写字母 Leetcode - 509.斐波那契数 题目&#xff1a;斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。 该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。…

node笔记_koa框架是什么?

文章目录 ⭐前言⭐ koa框架是如何发展而来的&#xff1f;⭐ koa框架的基本使用&#x1f496; 安装 koa&#x1f496; koa的Middleware示例&#x1f496; 支持xml ⭐ 结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文介绍node的一个web框架koa。 往期文章 node_window…

第三章: Mybatis-Plus 的通用CRUD API 练习使用

目录 1. Insert 操作 -> Create 1.1: TableId 的 id策略 1.2: TableField 2. Update 操作 -> Update 2.1: 根据 ID 更新 2.2: 根据条件更新 3. Delete 操作 -> Delete 3.1: deleteById 3.2: deleteByMap 3.3: delete 3.4: deleteBatchIds 4. Select 操作 -&g…

Redis修炼 (15. redis的持久化-RDB)

RDB 就是 redis database backup file 数据备份文件 就是把内存中的所有数据都保存在磁盘中。 save 注意这个保存过程是主进程在做 因为redis 是单线程 所有其他所有请求都会被卡死。 bgsave 这个稍微友好一点 是子进程 执行&#xff0c;避免主进程收到影响。 redis在服务停机…

【JavaWeb】-- Maven基础、MyBatis

文章目录 Maven基础1.Maven简介1.1 Maven模型1.2 仓库 2.Maven安装3.Maven基本使用3.1 Maven常用命令3.2 Maven生命周期 4.IDEA使用Maven4.1 IDEA配置Maven环境4.2 Maven坐标4.3 IDEA 创建Maven项目 5.依赖管理5.1 使用坐标引入jar包5.2 依赖范围 MyBatis1.MyBatis概述1.1JDBC的…

JDK、JRE和JVM三者的区别和联系

一、JDK、JRE、JVM分别是什么 &#xff08;一&#xff09;JDK JDK&#xff0c;全称Java Development Kit&#xff0c;是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。 &#xff08;二&#xff09;JRE J…