C# 如何扩展Exception
时间: 2023-07-12 13:25:03 浏览: 199
在 C# 中,可以通过继承 Exception 类来扩展异常。你可以编写一个自定义异常类,并从 Exception 类继承它。这样,你就可以在自定义异常类中添加自己的属性和方法。
下面是一个简单的例子,演示如何扩展 Exception 类:
```
public class MyCustomException : Exception
{
public string CustomProperty { get; set; }
public MyCustomException(string message, string customProperty) : base(message)
{
CustomProperty = customProperty;
}
}
```
在这个例子中,我们创建了一个名为 MyCustomException 的自定义异常类,并为它添加了一个名为 CustomProperty 的属性。我们还添加了一个自定义构造函数,以便在创建异常对象时设置 CustomProperty 属性的值。
现在,当我们在代码中抛出 MyCustomException 异常时,我们可以访问 CustomProperty 属性并获取它的值。
相关问题
Modbus-TCP C#
### C# 中实现 Modbus-TCP 通信
为了在 C# 中实现与 PLC 的 Modbus-TCP 通信,通常会创建一个专门用于处理这种通信的类。此类不仅能够简化代码结构,还能提高其可重用性和维护性。
下面是一个具体的例子,展示如何构建 `PLCModbusTCPCommunicationClass` 类来管理上位机与汇川 H5U PLC 之间的交互[^1]:
```csharp
using System;
using System.Net.Sockets;
public class PLCModbusTCPCommunicationClass {
private TcpClient tcpClient;
/// <summary>
/// 初始化一个新的实例.
/// </summary>
public PLCModbusTCPCommunicationClass(string ipAddress, int port) {
try {
this.tcpClient = new TcpClient(ipAddress, port);
}
catch (Exception e) {
Console.WriteLine($"连接失败: {e.Message}");
}
}
/// <summary>
/// 发送请求并接收响应数据包的方法.
/// </summary>
protected byte[] SendReceive(byte[] requestBytes) {
NetworkStream stream = null;
try {
if (!tcpClient.Connected) throw new Exception("未建立连接");
stream = tcpClient.GetStream();
stream.Write(requestBytes, 0, requestBytes.Length);
var buffer = new byte[256];
var bytesRead = stream.Read(buffer, 0, buffer.Length);
Array.Resize(ref buffer, bytesRead);
return buffer;
} finally {
if(stream != null){
stream.Close();
}
}
}
// 更多功能可以根据需求添加...
}
```
此段代码实现了基本的功能框架,包括初始化 TCP 连接和发送/接受消息的能力。对于更复杂的应用场景,则需进一步扩展该类以支持特定的操作,比如读取或设置寄存器值等[^2]。
另外,在实际应用中可能还需要考虑异常处理机制、超时控制等因素,确保程序稳定运行。同时建议参考官方文档或其他成熟开源项目中的最佳实践来进行开发[^3]。
c#wpf上位机开发
### C# WPF 上位机开发教程与示例
#### 使用C# WPF构建上位机应用程序概述
对于希望利用C# Windows Presentation Foundation (WPF) 构建高效能的上位机应用开发者而言,理解其基础架构至关重要。传统Windows Forms和其他GUI工具包相比,C# WPF引入了更加现代化的设计理念,借鉴Web开发中的最佳实践,实现了UI设计和业务逻辑的有效分离[^2]。
#### 创建基于Modbus RTU协议的数据通信模块
针对特定需求如温度湿度监控系统,在C# WPF环境中集成Modbus RTU协议可以极大简化硬件设备间的交互过程。此过程中不仅涉及到了基本的串行端口配置,还包括遵循该协议的具体命令集定义以及错误处理机制等细节[^1]。
#### 应用MVVM模式优化代码结构
为了提高项目的可维护性和扩展性,采用Model-View-ViewModel(MVVM)架构是一个明智的选择。通过运用轻量级库如MVVMLight来辅助实现这一目标,则可以使视图(View),模型(Model), 和视图模型(View Model)三者之间保持松耦合关系,从而便于后期的功能迭代和技术升级[^3]。
#### 实际操作指南:从零开始搭建一个简单的C# WPF上位机项目
假设现在要创建一个新的解决方案来进行温湿度传感器数据采集并展示给用户:
1. **初始化新工程**
启动Visual Studio IDE, 选择“新建项目”,挑选“.NET Framework下的WPF App (.NET Framework)”模板作为起点。
2. **安装必要的NuGet包**
右键点击解决方案资源管理器里的项目名称->"Manage Nuget Packages", 查找并添加`System.IO.Ports`, `GalaSoft.MvvmLight`, 及其他可能需要用到的支持类库。
3. **建立核心组件**
按照MVVM原则划分不同层次的内容;例如设置专门用于存储实体对象属性变化通知接口(`INotifyPropertyChanged`) 的基类文件夹Models; 定义所有UI相关联控件绑定源位置所在的ViewModels目录;最后是负责渲染页面布局效果Views部分。
4. **编码具体功能特性**
依据实际应用场景定制化各个部件的行为方式——比如定时轮询远程节点状态、解析接收到的消息体格式转换成易于理解和使用的变量形式等等。这里可能会涉及到一些高级话题像线程同步/异步调用、事件驱动编程范式等知识点的学习掌握。
5. **测试和完善用户体验**
确保每一个环节都能正常运作之后,再考虑加入更多人性化的交互元素进去提升整体质量感。这期间或许还需要反复调整参数设定直至达到理想的效果为止。
```csharp
// ViewModel 示例代码片段
using GalaSoft.MvvmLight;
using System.Windows.Threading;
public class MainViewModel : ViewModelBase {
private string _temperature;
public string Temperature {
get => _temperature;
set { Set(ref _temperature, value); }
}
private DispatcherTimer timer = new DispatcherTimer();
public MainViewModel() {
// 初始化计时器,每隔一秒更新一次温度显示
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e) {
try {
using(var port = new SerialPort("COM1")) {
port.Open();
byte[] commandBytes = Encoding.ASCII.GetBytes("01 03 00 00 00 02 CRC"); // 假设这是发送给PLC请求当前环境温度值的指令序列
port.Write(commandBytes , 0 ,commandBytes.Length );
Thread.Sleep(50);
int bytesToRead = port.BytesToRead;
byte[] responseBuffer = new byte[bytesToRead];
port.Read(responseBuffer, 0, bytesToRead );
var tempValue = ProcessResponseData(responseBuffer).ToString(); // 处理返回的数据流得到最终结果
Temperature = $"Current Temperture:{tempValue}°C";
}
} catch(Exception ex){
Debug.WriteLine($"Error occurred while reading temperature data.{ex.Message}");
}
}
private float ProcessResponseData(byte[] responseData) {
// 解析来自MODBUS RTU响应报文中携带的实际测量数值...
return BitConverter.ToSingle(new[]{responseData[3],responseData[2]},0);
}
}
```
阅读全文