You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/05/02 16:51:51 UTC

[plc4x] 03/03: refactor(plc4go): avoid panics if possible

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 7cc564ff827c1bd1fcf0a0dc6788363290229000
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue May 2 18:51:40 2023 +0200

    refactor(plc4go): avoid panics if possible
---
 plc4go/internal/ads/Discoverer.go               |   5 +-
 plc4go/internal/ads/model/Tag.go                |   2 +-
 plc4go/internal/cbus/CBusMessageMapper.go       |  45 +++++---
 plc4go/internal/cbus/TagHandler.go              |  16 +--
 plc4go/internal/cbus/ValueHandler.go            | 132 ++++++++++++------------
 plc4go/internal/eip/Reader.go                   |   4 +-
 plc4go/internal/simulated/Connection.go         |   4 +-
 plc4go/pkg/api/cache/plcConnectionLease_test.go |   4 +-
 plc4go/pkg/api/driverManager.go                 |   6 --
 plc4go/spi/default/DefaultConnection.go         |  10 +-
 plc4go/spi/default/DefaultConnection_test.go    |  10 +-
 plc4go/spi/testutils/DriverTestRunner.go        |   2 +-
 plc4go/spi/testutils/ManualTestRunner.go        |   6 +-
 plc4go/spi/utils/ReadBufferByteBased.go         |   2 +-
 plc4go/spi/utils/WriteBufferBoxBased.go         |   3 +-
 plc4go/spi/utils/WriteBufferJsonBased.go        |  42 ++++----
 plc4go/spi/values/WriteBufferPlcValueBased.go   |  36 +++----
 17 files changed, 165 insertions(+), 164 deletions(-)

diff --git a/plc4go/internal/ads/Discoverer.go b/plc4go/internal/ads/Discoverer.go
index f1d4fa25aa..c9ce8efeb8 100644
--- a/plc4go/internal/ads/Discoverer.go
+++ b/plc4go/internal/ads/Discoverer.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"encoding/binary"
 	"fmt"
+	"github.com/pkg/errors"
 	"net"
 	"net/url"
 	"strconv"
@@ -131,11 +132,11 @@ func (d *Discoverer) Discover(ctx context.Context, callback func(event apiModel.
 	for _, discoveryItem := range discoveryItems {
 		responseAddr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%d", discoveryItem.localAddress, model.AdsDiscoveryConstants_ADSDISCOVERYUDPDEFAULTPORT))
 		if err != nil {
-			panic(err)
+			return errors.Wrap(err, "error resolving udp")
 		}
 		socket, err := net.ListenUDP("udp4", responseAddr)
 		if err != nil {
-			panic(err)
+			return errors.Wrap(err, "error listening udp")
 		}
 		discoveryItem.socket = socket
 
diff --git a/plc4go/internal/ads/model/Tag.go b/plc4go/internal/ads/model/Tag.go
index 6f77f701c0..868466799e 100644
--- a/plc4go/internal/ads/model/Tag.go
+++ b/plc4go/internal/ads/model/Tag.go
@@ -158,7 +158,7 @@ func (m DirectPlcTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) er
 }
 
 func (m DirectPlcTag) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
-	panic(name)
+	return xml.Attr{}, errors.Errorf("%s", name) // TODO: why did this panic before
 }
 
 type SymbolicPlcTag struct {
diff --git a/plc4go/internal/cbus/CBusMessageMapper.go b/plc4go/internal/cbus/CBusMessageMapper.go
index a8e5ca53a1..a51e604dbf 100644
--- a/plc4go/internal/cbus/CBusMessageMapper.go
+++ b/plc4go/internal/cbus/CBusMessageMapper.go
@@ -96,7 +96,8 @@ func TagToCBusMessage(tag apiModel.PlcTag, value apiValues.PlcValue, alphaGenera
 		var salData readWriteModel.SALData
 		switch tagType.application.ApplicationId() {
 		case readWriteModel.ApplicationId_FREE_USAGE:
-			panic("Not yet implemented") // TODO: implement
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_TEMPERATURE_BROADCAST:
 			var temperatureBroadcastData readWriteModel.TemperatureBroadcastData
 			switch salCommand {
@@ -114,7 +115,8 @@ func TagToCBusMessage(tag apiModel.PlcTag, value apiValues.PlcValue, alphaGenera
 			}
 			salData = readWriteModel.NewSALDataTemperatureBroadcast(temperatureBroadcastData, nil)
 		case readWriteModel.ApplicationId_ROOM_CONTROL_SYSTEM:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case
 			readWriteModel.ApplicationId_LIGHTING,
 			readWriteModel.ApplicationId_VENTILATION,
@@ -166,35 +168,48 @@ func TagToCBusMessage(tag apiModel.PlcTag, value apiValues.PlcValue, alphaGenera
 				lightingData = readWriteModel.NewLightingDataTerminateRamp(group, commandTypeContainer)
 				supportsWrite = true
 			case readWriteModel.LightingCommandType_LABEL.PLC4XEnumName():
-				panic("Implement me")
+				err = errors.New("Not yet implemented") // TODO: implement
+				return
 			default:
 				return nil, false, false, false, errors.Errorf("Unsupported command %s for %s", salCommand, tagType.application.ApplicationId())
 			}
 			salData = readWriteModel.NewSALDataLighting(lightingData, nil)
 		case readWriteModel.ApplicationId_AIR_CONDITIONING:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_TRIGGER_CONTROL:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_ENABLE_CONTROL:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_SECURITY:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_METERING:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_ACCESS_CONTROL:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_CLOCK_AND_TIMEKEEPING:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_TELEPHONY_STATUS_AND_CONTROL:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_MEASUREMENT:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_TESTING:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_MEDIA_TRANSPORT_CONTROL:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		case readWriteModel.ApplicationId_ERROR_REPORTING:
-			panic("Implement me")
+			err = errors.New("Not yet implemented") // TODO: implement
+			return
 		default:
 			return nil, false, false, false, errors.Errorf("No support for %s", tagType.application)
 		}
diff --git a/plc4go/internal/cbus/TagHandler.go b/plc4go/internal/cbus/TagHandler.go
index 5da0695fbf..4fb943ef1d 100644
--- a/plc4go/internal/cbus/TagHandler.go
+++ b/plc4go/internal/cbus/TagHandler.go
@@ -145,8 +145,8 @@ func (m TagHandler) handleStatusRequestPattern(match map[string]string) (apiMode
 		} else if levelArgument := match["startingGroupAddressLabel"]; levelArgument != "" {
 			statusRequestType = StatusRequestTypeLevel
 			decodedHex, _ := hex.DecodeString(levelArgument)
-			if len(decodedHex) != 1 {
-				panic("invalid state. Should have exactly 1")
+			if hexLength := len(decodedHex); hexLength != 1 {
+				return nil, errors.Errorf("invalid state. Should have exactly 1. Actual length %d", hexLength)
 			}
 			startingGroupAddressLabel = &decodedHex[0]
 		} else {
@@ -177,7 +177,7 @@ func (m TagHandler) handleCalPattern(match map[string]string) (apiModel.PlcTag,
 	calTypeArgument := match["calType"]
 	switch {
 	case strings.HasPrefix(calTypeArgument, "reset"):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	case strings.HasPrefix(calTypeArgument, "recall="):
 		var recalParamNo readWriteModel.Parameter
 		recallParamNoArgument := match["recallParamNo"]
@@ -263,15 +263,15 @@ func (m TagHandler) handleCalPattern(match map[string]string) (apiModel.PlcTag,
 		count = uint8(atoi)
 		return NewCALGetStatusTag(unitAddress, bridgeAddresses, recalParamNo, count, 1), nil
 	case strings.HasPrefix(calTypeArgument, "write="):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	case strings.HasPrefix(calTypeArgument, "identifyReply="):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	case strings.HasPrefix(calTypeArgument, "reply="):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	case strings.HasPrefix(calTypeArgument, "status="):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	case strings.HasPrefix(calTypeArgument, "statusExtended="):
-		panic("Not implemented") // TODO: implement me
+		return nil, errors.New("Not implemented") // TODO: implement me
 	default:
 		return nil, errors.Errorf("Invalid cal type %s", calTypeArgument)
 	}
diff --git a/plc4go/internal/cbus/ValueHandler.go b/plc4go/internal/cbus/ValueHandler.go
index a58dd6201f..1bdb4638b2 100644
--- a/plc4go/internal/cbus/ValueHandler.go
+++ b/plc4go/internal/cbus/ValueHandler.go
@@ -45,7 +45,7 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 			CAL_IDENTIFY_REPLY,
 			CAL_STATUS,
 			CAL_STATUS_EXTENDED:
-			panic("Implement me") //TODO: implement me
+			return nil, errors.New("Implement me") //TODO: implement me
 		case SAL:
 			var curValues []any
 			if len(tag.GetArrayInfo()) > 0 && tag.GetArrayInfo()[0].GetSize() > 1 {
@@ -143,7 +143,7 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 					}
 					return group, nil
 				case readWriteModel.LightingCommandType_LABEL.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
@@ -156,13 +156,13 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 					}
 					return zoneGroup, nil
 				case readWriteModel.AirConditioningCommandType_ZONE_HVAC_PLANT_STATUS.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_ZONE_HUMIDITY_PLANT_STATUS.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_ZONE_TEMPERATURE.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_ZONE_HUMIDITY.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_REFRESH.PLC4XEnumName():
 					zoneGroup, err := m.DefaultValueHandler.NewPlcValueFromType(apiValues.BYTE, curValues[0])
 					if err != nil {
@@ -170,23 +170,23 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 					}
 					return zoneGroup, nil
 				case readWriteModel.AirConditioningCommandType_SET_ZONE_HVAC_MODE.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_PLANT_HVAC_LEVEL.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_ZONE_HUMIDITY_MODE.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_PLANT_HUMIDITY_LEVEL.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_HVAC_UPPER_GUARD_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_HVAC_LOWER_GUARD_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_HVAC_SETBACK_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_HUMIDITY_UPPER_GUARD_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_HUMIDITY_LOWER_GUARD_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_SET_ZONE_GROUP_ON.PLC4XEnumName():
 					zoneGroup, err := m.DefaultValueHandler.NewPlcValueFromType(apiValues.BYTE, curValues[0])
 					if err != nil {
@@ -194,95 +194,95 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 					}
 					return zoneGroup, nil
 				case readWriteModel.AirConditioningCommandType_SET_HUMIDITY_SETBACK_LIMIT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_HVAC_SCHEDULE_ENTRY.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AirConditioningCommandType_HUMIDITY_SCHEDULE_ENTRY.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_TRIGGER_CONTROL:
 				switch salCommand {
 				case readWriteModel.TriggerControlCommandType_TRIGGER_EVENT.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.TriggerControlCommandType_TRIGGER_MIN.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.TriggerControlCommandType_TRIGGER_MAX.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.TriggerControlCommandType_INDICATOR_KILL.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.TriggerControlCommandType_LABEL.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_ENABLE_CONTROL:
 				switch salCommand {
 				case readWriteModel.EnableControlCommandType_SET_NETWORK_VARIABLE.PLC4XEnumName():
-					panic("Implement me") //TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_SECURITY:
 				switch salCommand {
 				case readWriteModel.SecurityCommandType_OFF.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.SecurityCommandType_ON.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.SecurityCommandType_EVENT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_METERING:
 				switch salCommand {
 				case readWriteModel.MeteringCommandType_EVENT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_ACCESS_CONTROL:
 				switch salCommand {
 				case readWriteModel.AccessControlCommandType_CLOSE_ACCESS_POINT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_LOCK_ACCESS_POINT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_ACCESS_POINT_LEFT_OPEN.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_ACCESS_POINT_FORCED_OPEN.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_ACCESS_POINT_CLOSED.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_REQUEST_TO_EXIT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_VALID_ACCESS.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.AccessControlCommandType_INVALID_ACCESS.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_CLOCK_AND_TIMEKEEPING:
 				switch salCommand {
 				case readWriteModel.ClockAndTimekeepingCommandType_UPDATE_NETWORK_VARIABLE.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				case readWriteModel.ClockAndTimekeepingCommandType_REQUEST_REFRESH.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_TELEPHONY_STATUS_AND_CONTROL:
 				switch salCommand {
 				case readWriteModel.TelephonyCommandType_EVENT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_MEASUREMENT:
 				switch salCommand {
 				case readWriteModel.MeasurementCommandType_MEASUREMENT_EVENT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement
+					return nil, errors.New("Implement me") //TODO: implement me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
@@ -295,62 +295,62 @@ func (m ValueHandler) NewPlcValue(tag apiModel.PlcTag, value any) (apiValues.Plc
 			case readWriteModel.ApplicationId_MEDIA_TRANSPORT_CONTROL:
 				switch salCommand {
 				case readWriteModel.MediaTransportControlCommandType_STOP.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_PLAY.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_PAUSE_RESUME.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SELECT_CATEGORY.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SELECT_SELECTION.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SELECT_TRACK.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SHUFFLE_ON_OFF.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_REPEAT_ON_OFF.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_NEXT_PREVIOUS_CATEGORY.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_NEXT_PREVIOUS_SELECTION.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_NEXT_PREVIOUS_TRACK.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_FAST_FORWARD.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_REWIND.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SOURCE_POWER_CONTROL.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_TOTAL_TRACKS.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_STATUS_REQUEST.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_ENUMERATE_CATEGORIES_SELECTIONS_TRACKS.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_ENUMERATION_SIZE.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_TRACK_NAME.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_SELECTION_NAME.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_CATEGORY_NAME.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.MediaTransportControlCommandType_FAST_FORWARD.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
 			case readWriteModel.ApplicationId_ERROR_REPORTING:
 				switch salCommand {
 				case readWriteModel.ErrorReportingCommandType_DEPRECATED.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.ErrorReportingCommandType_ERROR_REPORT.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.ErrorReportingCommandType_ACKNOWLEDGE.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				case readWriteModel.ErrorReportingCommandType_CLEAR_MOST_SEVERE.PLC4XEnumName():
-					panic("Implement me") // TODO: implement me
+					return nil, errors.New("Implement me") //TODO: implement me me
 				default:
 					return nil, errors.Errorf("Unsupported command %s for %s", salCommand, tmpSalTag.application.ApplicationId())
 				}
diff --git a/plc4go/internal/eip/Reader.go b/plc4go/internal/eip/Reader.go
index 6526071542..3348aecde0 100644
--- a/plc4go/internal/eip/Reader.go
+++ b/plc4go/internal/eip/Reader.go
@@ -281,7 +281,7 @@ func parsePlcValue(tag EIPPlcTag, data utils.ReadBufferByteBased, _type readWrit
 				list = append(list, spiValues.NewPlcSINT(readInt8))
 			case readWriteModel.CIPDataTypeCode_REAL:
 				if _type.Size()*8 != 64 {
-					panic("Unexpected size")
+					return nil, errors.New("Unexpected size")
 				}
 				readFloat64, err := data.ReadFloat64("", 64)
 				if err != nil {
@@ -321,7 +321,7 @@ func parsePlcValue(tag EIPPlcTag, data utils.ReadBufferByteBased, _type readWrit
 			return spiValues.NewPlcDINT(readInt32), nil
 		case readWriteModel.CIPDataTypeCode_REAL:
 			if _type.Size()*8 != 64 {
-				panic("Unexpected size")
+				return nil, errors.New("Unexpected size")
 			}
 			readFloat32, err := data.ReadFloat32("", 64)
 			if err != nil {
diff --git a/plc4go/internal/simulated/Connection.go b/plc4go/internal/simulated/Connection.go
index e6ef48d492..a56287d140 100644
--- a/plc4go/internal/simulated/Connection.go
+++ b/plc4go/internal/simulated/Connection.go
@@ -241,9 +241,9 @@ func (c *Connection) SubscriptionRequestBuilder() model.PlcSubscriptionRequestBu
 }
 
 func (c *Connection) UnsubscriptionRequestBuilder() model.PlcUnsubscriptionRequestBuilder {
-	panic("not implemented")
+	panic("not provided by simulated connection")
 }
 
 func (c *Connection) BrowseRequestBuilder() model.PlcBrowseRequestBuilder {
-	panic("not implemented")
+	panic("not provided by simulated connection")
 }
diff --git a/plc4go/pkg/api/cache/plcConnectionLease_test.go b/plc4go/pkg/api/cache/plcConnectionLease_test.go
index a90141d224..5ed63ab180 100644
--- a/plc4go/pkg/api/cache/plcConnectionLease_test.go
+++ b/plc4go/pkg/api/cache/plcConnectionLease_test.go
@@ -565,7 +565,7 @@ func TestLeasedPlcConnection_UnsubscriptionRequestBuilder(t *testing.T) {
 				func() {
 					defer func() {
 						if r := recover(); r != nil {
-							assert.Equal(t, r, "not implemented")
+							assert.Equal(t, r, "not provided by simulated connection")
 						} else {
 							t.Errorf("The code did not panic")
 						}
@@ -615,7 +615,7 @@ func TestLeasedPlcConnection_BrowseRequestBuilder(t *testing.T) {
 				func() {
 					defer func() {
 						if r := recover(); r != nil {
-							assert.Equal(t, r, "not implemented")
+							assert.Equal(t, r, "not provided by simulated connection")
 						} else {
 							t.Errorf("The code did not panic")
 						}
diff --git a/plc4go/pkg/api/driverManager.go b/plc4go/pkg/api/driverManager.go
index 2e182dda8d..411f4979e9 100644
--- a/plc4go/pkg/api/driverManager.go
+++ b/plc4go/pkg/api/driverManager.go
@@ -137,9 +137,6 @@ func convertToInternalOptions(withDiscoveryOptions ...WithDiscoveryOption) []opt
 ///////////////////////////////////////
 
 func (m *plcDriverManger) RegisterDriver(driver PlcDriver) {
-	if driver == nil {
-		panic("driver must not be nil")
-	}
 	log.Debug().Str("protocolName", driver.GetProtocolName()).Msg("Registering driver")
 	// If this driver is already registered, just skip resetting it
 	for driverName := range m.drivers {
@@ -170,9 +167,6 @@ func (m *plcDriverManger) GetDriver(driverName string) (PlcDriver, error) {
 }
 
 func (m *plcDriverManger) RegisterTransport(transport transports.Transport) {
-	if transport == nil {
-		panic("transport must not be nil")
-	}
 	log.Debug().Str("transportName", transport.GetTransportName()).Msg("Registering transport")
 	// If this transport is already registered, just skip resetting it
 	for transportName := range m.transports {
diff --git a/plc4go/spi/default/DefaultConnection.go b/plc4go/spi/default/DefaultConnection.go
index 798548bf8a..7ce2a07cdf 100644
--- a/plc4go/spi/default/DefaultConnection.go
+++ b/plc4go/spi/default/DefaultConnection.go
@@ -307,23 +307,23 @@ func (d *defaultConnection) GetMetadata() model.PlcConnectionMetadata {
 }
 
 func (d *defaultConnection) ReadRequestBuilder() model.PlcReadRequestBuilder {
-	panic("not implemented")
+	panic("not provided by actual connection")
 }
 
 func (d *defaultConnection) WriteRequestBuilder() model.PlcWriteRequestBuilder {
-	panic("not implemented")
+	panic("not provided by actual connection")
 }
 
 func (d *defaultConnection) SubscriptionRequestBuilder() model.PlcSubscriptionRequestBuilder {
-	panic("not implemented")
+	panic("not provided by actual connection")
 }
 
 func (d *defaultConnection) UnsubscriptionRequestBuilder() model.PlcUnsubscriptionRequestBuilder {
-	panic("not implemented")
+	panic("not provided by actual connection")
 }
 
 func (d *defaultConnection) BrowseRequestBuilder() model.PlcBrowseRequestBuilder {
-	panic("not implemented")
+	panic("not provided by actual connection")
 }
 
 func (d *defaultConnection) GetTransportInstance() transports.TransportInstance {
diff --git a/plc4go/spi/default/DefaultConnection_test.go b/plc4go/spi/default/DefaultConnection_test.go
index d07b02c5db..f6d46ab64b 100644
--- a/plc4go/spi/default/DefaultConnection_test.go
+++ b/plc4go/spi/default/DefaultConnection_test.go
@@ -477,7 +477,7 @@ func Test_defaultConnection_BrowseRequestBuilder(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if err := recover(); err != nil {
-					assert.Equal(t, "not implemented", err)
+					assert.Equal(t, "not provided by actual connection", err)
 				} else {
 					t.Error("should fail")
 				}
@@ -903,7 +903,7 @@ func Test_defaultConnection_ReadRequestBuilder(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if err := recover(); err != nil {
-					assert.Equal(t, "not implemented", err)
+					assert.Equal(t, "not provided by actual connection", err)
 				} else {
 					t.Error("should fail")
 				}
@@ -975,7 +975,7 @@ func Test_defaultConnection_SubscriptionRequestBuilder(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if err := recover(); err != nil {
-					assert.Equal(t, "not implemented", err)
+					assert.Equal(t, "not provided by actual connection", err)
 				} else {
 					t.Error("should fail")
 				}
@@ -1013,7 +1013,7 @@ func Test_defaultConnection_UnsubscriptionRequestBuilder(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if err := recover(); err != nil {
-					assert.Equal(t, "not implemented", err)
+					assert.Equal(t, "not provided by actual connection", err)
 				} else {
 					t.Error("should fail")
 				}
@@ -1051,7 +1051,7 @@ func Test_defaultConnection_WriteRequestBuilder(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			defer func() {
 				if err := recover(); err != nil {
-					assert.Equal(t, "not implemented", err)
+					assert.Equal(t, "not provided by actual connection", err)
 				} else {
 					t.Error("should fail")
 				}
diff --git a/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/spi/testutils/DriverTestRunner.go
index c3a971acc5..58c2d9feea 100644
--- a/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/spi/testutils/DriverTestRunner.go
@@ -323,7 +323,7 @@ func (m DriverTestsuite) ExecuteStep(t *testing.T, connection plc4go.PlcConnecti
 		}
 		actualRawOutput := testTransportInstance.DrainWriteBuffer(expectedRawOutputLength)
 		if testTransportInstance.GetNumDrainableBytes() != 0 {
-			//panic(fmt.Sprintf("leftover drainable bytes (%d)", testTransportInstance.GetNumDrainableBytes()))
+			t.Logf("leftover drainable bytes (%d)", testTransportInstance.GetNumDrainableBytes())
 		}
 
 		var bufferFactory func([]byte, ...utils.ReadBufferByteBasedOptions) utils.ReadBufferByteBased
diff --git a/plc4go/spi/testutils/ManualTestRunner.go b/plc4go/spi/testutils/ManualTestRunner.go
index 2ec36ccfde..d0d5bb0dc4 100644
--- a/plc4go/spi/testutils/ManualTestRunner.go
+++ b/plc4go/spi/testutils/ManualTestRunner.go
@@ -112,14 +112,14 @@ func (m *ManualTestSuite) runSingleTest(t *testing.T, connection plc4go.PlcConne
 	readRequestBuilder.AddTagAddress(tagName, testCase.Address)
 	readRequest, err := readRequestBuilder.Build()
 	if err != nil {
-		panic(err)
+		t.Fatal(err)
+		return
 	}
 
 	// Execute the read request
 	readResponseResult := <-readRequest.Execute()
 	if readResponseResult.GetErr() != nil {
-		t.Errorf("Error getting response %v", readResponseResult.GetErr())
-		t.FailNow()
+		t.Fatalf("Error getting response %v", readResponseResult.GetErr())
 		return
 	}
 	readResponse := readResponseResult.GetResponse()
diff --git a/plc4go/spi/utils/ReadBufferByteBased.go b/plc4go/spi/utils/ReadBufferByteBased.go
index 3ffa13c66a..d9957e538f 100644
--- a/plc4go/spi/utils/ReadBufferByteBased.go
+++ b/plc4go/spi/utils/ReadBufferByteBased.go
@@ -96,7 +96,7 @@ func (rb *byteReadBuffer) Reset(pos uint16) {
 	bytesToSkip := make([]byte, pos)
 	_, err := rb.reader.Read(bytesToSkip)
 	if err != nil {
-		panic(err)
+		panic(errors.Wrap(err, "Should not happen")) // TODO: maybe this is a possible occurence since we accept a argument, better returns a error
 	}
 	rb.pos = uint64(pos * 8)
 }
diff --git a/plc4go/spi/utils/WriteBufferBoxBased.go b/plc4go/spi/utils/WriteBufferBoxBased.go
index b076cb51ff..f706a90f76 100644
--- a/plc4go/spi/utils/WriteBufferBoxBased.go
+++ b/plc4go/spi/utils/WriteBufferBoxBased.go
@@ -23,6 +23,7 @@ import (
 	"container/list"
 	"context"
 	"fmt"
+	"github.com/pkg/errors"
 	"math/big"
 )
 
@@ -264,7 +265,7 @@ findTheBox:
 			finalBoxes = append(asciiBoxes, finalBoxes...)
 			break findTheBox
 		default:
-			panic("We should never reach this point")
+			return errors.New("We should never reach this point")
 		}
 	}
 	if b.mergeSingleBoxes && len(finalBoxes) == 1 {
diff --git a/plc4go/spi/utils/WriteBufferJsonBased.go b/plc4go/spi/utils/WriteBufferJsonBased.go
index 98000381f2..c6eca9b29d 100644
--- a/plc4go/spi/utils/WriteBufferJsonBased.go
+++ b/plc4go/spi/utils/WriteBufferJsonBased.go
@@ -198,17 +198,15 @@ func (j *jsonWriteBuffer) PopContext(logicalName string, _ ...WithWriterArgs) er
 	pop := j.Pop()
 	var poppedName string
 	var unwrapped any
-	switch pop.(type) {
+	switch _context := pop.(type) {
 	case *elementContext:
-		context := pop.(*elementContext)
-		poppedName = context.logicalName
-		unwrapped = context.properties
+		poppedName = _context.logicalName
+		unwrapped = _context.properties
 	case *listContext:
-		context := pop.(*listContext)
-		poppedName = context.logicalName
-		unwrapped = context.list
+		poppedName = _context.logicalName
+		unwrapped = _context.list
 	default:
-		panic("broken context")
+		return errors.New("broken context")
 	}
 	if poppedName != logicalName {
 		return errors.Errorf("unexpected closing context %s, expected %s", poppedName, logicalName)
@@ -220,17 +218,15 @@ func (j *jsonWriteBuffer) PopContext(logicalName string, _ ...WithWriterArgs) er
 		return nil
 	}
 	j.rootNode = j.Peek()
-	switch j.rootNode.(type) {
+	switch _context := j.rootNode.(type) {
 	case *elementContext:
-		context := j.rootNode.(*elementContext)
-		context.properties[logicalName] = unwrapped
+		_context.properties[logicalName] = unwrapped
 	case *listContext:
-		context := j.rootNode.(*listContext)
 		wrappedWrap := make(map[string]any)
 		wrappedWrap[logicalName] = unwrapped
-		context.list = append(context.list, wrappedWrap)
+		_context.list = append(_context.list, wrappedWrap)
 	default:
-		panic("broken context")
+		return errors.New("broken context")
 	}
 	return nil
 }
@@ -249,30 +245,28 @@ func (j *jsonWriteBuffer) GetJsonString() (string, error) {
 func (j *jsonWriteBuffer) encodeNode(logicalName string, value any, attr map[string]any, _ ...WithWriterArgs) error {
 	logicalName = j.SanitizeLogicalName(logicalName)
 	peek := j.Peek()
-	switch peek.(type) {
+	switch _context := peek.(type) {
 	case *elementContext:
-		context := peek.(*elementContext)
-		context.properties[logicalName] = value
+		_context.properties[logicalName] = value
 		for key, attrValue := range attr {
-			context.properties[key] = attrValue
+			_context.properties[key] = attrValue
 		}
 		return nil
 	case *listContext:
-		context := peek.(*listContext)
 		m := make(map[string]any)
 		m[logicalName] = value
 		for attrKey, attrValue := range attr {
 			m[attrKey] = attrValue
 		}
-		context.list = append(context.list, m)
+		_context.list = append(_context.list, m)
 		return nil
 	default:
-		context := &elementContext{logicalName, make(map[string]any)}
-		context.properties[logicalName] = value
+		newContext := &elementContext{logicalName, make(map[string]any)}
+		newContext.properties[logicalName] = value
 		for key, attrValue := range attr {
-			context.properties[key] = attrValue
+			newContext.properties[key] = attrValue
 		}
-		j.Push(context)
+		j.Push(newContext)
 		return nil
 	}
 }
diff --git a/plc4go/spi/values/WriteBufferPlcValueBased.go b/plc4go/spi/values/WriteBufferPlcValueBased.go
index d969023ec1..8189e00b7f 100644
--- a/plc4go/spi/values/WriteBufferPlcValueBased.go
+++ b/plc4go/spi/values/WriteBufferPlcValueBased.go
@@ -182,17 +182,15 @@ func (p *writeBufferPlcValueBased) PopContext(logicalName string, _ ...utils.Wit
 	pop := p.Pop()
 	var poppedName string
 	var unwrapped apiValues.PlcValue
-	switch pop.(type) {
+	switch _context := pop.(type) {
 	case *plcValueContext:
-		context := pop.(*plcValueContext)
-		poppedName = context.logicalName
-		unwrapped = NewPlcStruct(context.properties)
+		poppedName = _context.logicalName
+		unwrapped = NewPlcStruct(_context.properties)
 	case *plcListContext:
-		context := pop.(*plcListContext)
-		poppedName = context.logicalName
-		unwrapped = NewPlcList(context.list)
+		poppedName = _context.logicalName
+		unwrapped = NewPlcList(_context.list)
 	default:
-		panic("broken context")
+		return errors.New("broken context")
 	}
 	if poppedName != logicalName {
 		return errors.Errorf("unexpected closing context %s, expected %s", poppedName, logicalName)
@@ -201,13 +199,13 @@ func (p *writeBufferPlcValueBased) PopContext(logicalName string, _ ...utils.Wit
 		p.rootNode = NewPlcStruct(map[string]apiValues.PlcValue{logicalName: unwrapped})
 		return nil
 	}
-	switch context := p.Peek().(type) {
+	switch _context := p.Peek().(type) {
 	case *plcValueContext:
-		context.properties[logicalName] = unwrapped
+		_context.properties[logicalName] = unwrapped
 	case *plcListContext:
-		context.list = append(context.list, NewPlcStruct(map[string]apiValues.PlcValue{logicalName: unwrapped}))
+		_context.list = append(_context.list, NewPlcStruct(map[string]apiValues.PlcValue{logicalName: unwrapped}))
 	default:
-		panic("broken context")
+		return errors.New("broken context")
 	}
 	return nil
 }
@@ -219,19 +217,17 @@ func (p *writeBufferPlcValueBased) GetPlcValue() apiValues.PlcValue {
 func (p *writeBufferPlcValueBased) appendValue(logicalName string, value apiValues.PlcValue) error {
 	logicalName = p.SanitizeLogicalName(logicalName)
 	peek := p.Peek()
-	switch peek.(type) {
+	switch _context := peek.(type) {
 	case *plcValueContext:
-		context := peek.(*plcValueContext)
-		context.properties[logicalName] = value
+		_context.properties[logicalName] = value
 		return nil
 	case *plcListContext:
-		context := peek.(*plcListContext)
-		context.list = append(context.list, value)
+		_context.list = append(_context.list, value)
 		return nil
 	default:
-		context := &plcValueContext{logicalName, make(map[string]apiValues.PlcValue)}
-		context.properties[logicalName] = value
-		p.Push(context)
+		newContext := &plcValueContext{logicalName, make(map[string]apiValues.PlcValue)}
+		newContext.properties[logicalName] = value
+		p.Push(newContext)
 		return nil
 	}
 }