New: better Exception Handling
All checks were successful
Build and Push Docker Image / build (push) Successful in 7m0s

This commit is contained in:
2026-03-18 09:47:58 +01:00
parent d90a6f970f
commit 18289006d1
9 changed files with 140 additions and 68 deletions

View File

@@ -1,4 +1,9 @@
@inherits LayoutComponentBase
@using Services
@inherits LayoutComponentBase
@implements IDisposable
@rendermode RenderMode.InteractiveServer
@inject IErrorService ErrorService
<div class="page">
<div class="sidebar">
@@ -7,6 +12,13 @@
<main>
<article class="content px-4">
@if(ErrorService.ex != null) {
<div class="alert alert-danger m-3" role="alert">
@ErrorService.ex.Message
<button type="button" class="btn-close float-end" aria-label="Close" @onclick="DismissError"></button>
</div>
}
@Body
</article>
</main>
@@ -17,3 +29,20 @@
<a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span>
</div>
@code {
protected override void OnInitialized()
{
ErrorService.OnChange += StateHasChanged;
}
private void DismissError()
{
ErrorService.ex = null;
}
public void Dispose()
{
ErrorService.OnChange -= StateHasChanged;
}
}

View File

@@ -0,0 +1,18 @@
@page "/ErrorTest"
@using Microsoft.Data.SqlClient
@using Services
@inject IErrorService ErrorService
<PageTitle>Error Test</PageTitle>
<h1>Error Page</h1>
<button @onclick="SetError" class="btn btn-primary">Set Error</button>
@code {
private void SetError() {
ErrorService.ex = new Exception("Hello World");
}
}

View File

@@ -1,7 +1,9 @@
@page "/"
@using Models
@using Services
@using System.Runtime.InteropServices
@inject IRentService RentService
@inject IErrorService ErrorService
<PageTitle>Home</PageTitle>
@@ -45,9 +47,11 @@
protected override void OnInitialized()
{
_vehicles = RentService.GetAvailableCars();
Console.WriteLine("VC" + _vehicles.Count);
@* return Task.CompletedTask; *@
try {
_vehicles = RentService.GetAvailableCars();
} catch (Exception e) {
ErrorService.ex = e;
}
}
}

View File

@@ -1,8 +1,10 @@
@page "/rent"
@using Models
@using Services
@using System.Runtime.InteropServices
@inject IRentService RentService
@inject NavigationManager NavigationManager
@inject IErrorService ErrorService
<PageTitle>Rent</PageTitle>
@@ -41,15 +43,22 @@
protected override void OnInitialized()
{
_vehicles = RentService.GetAvailableCars();
_customers = RentService.GetCustomers();
try {
_vehicles = RentService.GetAvailableCars();
_customers = RentService.GetCustomers();
} catch (Exception e) {
ErrorService.ex = e;
}
}
private Task RentCar()
{
RentService.RentCar(_customerId, _vehicleId, _from, _thru);
Console.WriteLine("Rented Car");
NavigationManager.NavigateTo("/");
try {
RentService.RentCar(_customerId, _vehicleId, _from, _thru);
NavigationManager.NavigateTo("/");
} catch (Exception e) {
ErrorService.ex = e;
}
return Task.CompletedTask;
}
}

View File

@@ -2,6 +2,7 @@
@using Models
@using Services
@inject IRollbackService RollbackService
@inject IErrorService ErrorService
<PageTitle>Rollback</PageTitle>
@@ -12,7 +13,11 @@
@code {
private Task PerformRollback() {
RollbackService.ResetToDefaults();
try {
RollbackService.ResetToDefaults();
} catch (Exception e) {
ErrorService.ex = e;
}
return Task.CompletedTask;
}
}

View File

@@ -17,6 +17,7 @@ public static class ServiceCollectionExtension
services.Services.AddScoped<IRentService, RentService>();
services.Services.AddScoped<IRollbackService, RollbackService>();
services.Services.AddScoped<IErrorService, ErrorService>();
return services;
}
}

View File

@@ -0,0 +1,30 @@
using System.Data;
using Configuration;
using Microsoft.Data.SqlClient;
using Models;
namespace Services
{
public interface IErrorService
{
Exception? ex { get; set; }
event Action? OnChange;
}
public class ErrorService : IErrorService
{
private Exception? _ex;
public Exception? ex
{
get => _ex;
set
{
_ex = value;
NotifyStateChanged();
}
}
public event Action? OnChange;
private void NotifyStateChanged() => OnChange?.Invoke();
}
}

View File

@@ -17,22 +17,16 @@ namespace Services
public List<Vehicle> GetAvailableCars()
{
List<Vehicle> vehicles = new List<Vehicle>();
try
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM v_VerfuegbareFahrzeuge;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader();
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM v_VerfuegbareFahrzeuge;";
SqlCommand cmd = new SqlCommand(sql, conn);
while (reader.Read())
{
vehicles.Add(Vehicle.FromReader(reader));
}
}
catch (Exception e)
using SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(e);
vehicles.Add(Vehicle.FromReader(reader));
}
return vehicles;
@@ -41,45 +35,34 @@ namespace Services
public List<Customer> GetCustomers()
{
List<Customer> customers = new List<Customer>();
try
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM Customer;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = "SELECT * FROM Customer;";
SqlCommand cmd = new SqlCommand(sql, conn);
using SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
customers.Add(Customer.FromReader(reader));
}
customers.Add(Customer.FromReader(reader));
}
catch (Exception e)
{
Console.WriteLine(e);
}
return customers;
}
public void RentCar(long customerId, long vehicleId, DateTime start, DateTime end)
{
try
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
using SqlCommand cmd = new SqlCommand("sp_MieteFahrzeug", conn);
cmd.CommandType = CommandType.StoredProcedure;
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
using SqlCommand cmd = new SqlCommand("sp_MieteFahrzeug", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@KundeID", customerId);
cmd.Parameters.AddWithValue("@FahrzeugID", vehicleId);
cmd.Parameters.AddWithValue("@Start", start);
cmd.Parameters.AddWithValue("@Ende", end);
cmd.Parameters.AddWithValue("@KundeID", customerId);
cmd.Parameters.AddWithValue("@FahrzeugID", vehicleId);
cmd.Parameters.AddWithValue("@Start", start);
cmd.Parameters.AddWithValue("@Ende", end);
cmd.ExecuteNonQuery();
}catch (Exception ex)
{
Console.WriteLine(ex);
}
cmd.ExecuteNonQuery();
}
}
}

View File

@@ -14,24 +14,17 @@ namespace Services
{
public void ResetToDefaults()
{
try
{
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
using SqlConnection conn = sqlConnectionFactory.CreateSqlConnection();
string sql = @"
USE [master];
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] FROM DATABASE_SNAPSHOT = '2025_5bhitn_konstantin_hintermayer_smarter_rentDB_snapshot';
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET MULTI_USER;";
string sql = @"
USE [master];
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] FROM DATABASE_SNAPSHOT = '2025_5bhitn_konstantin_hintermayer_smarter_rentDB_snapshot';
ALTER DATABASE [2025_5bhitn_konstantin_hintermayer_smarter_rentDB] SET MULTI_USER;";
using SqlCommand cmd = new SqlCommand(sql, conn);
using SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
cmd.ExecuteNonQuery();
}
}
}