diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index 02ad35248d5..e357e9c20d3 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -56,10 +56,10 @@ var/pipenetwarnings = 10
if(item.parent)
if(pipenetwarnings > 0)
- error("[item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])")
+ warning("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])")
pipenetwarnings -= 1
if(pipenetwarnings == 0)
- error("further messages about pipenets will be supressed")
+ warning("build_pipeline(): further messages about pipenets will be supressed")
members += item
possible_expansions += item
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index c253e1e02e6..39c1e325b99 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -1,8 +1,3 @@
-//print an error message to world.log
-#define ERROR(MSG) error("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
-/proc/error(msg)
- world.log << "## ERROR: [msg]"
-
//print a warning message to world.log
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
/proc/warning(msg)
diff --git a/code/__HELPERS/bygex/bygex.dm b/code/__HELPERS/bygex/bygex.dm
index 0d791273b34..c5c4999ccca 100644
--- a/code/__HELPERS/bygex/bygex.dm
+++ b/code/__HELPERS/bygex/bygex.dm
@@ -101,27 +101,27 @@
if(!i) return str
var/datum/match/M = matches[i]
if(i < 1 || i > matches.len)
- ERROR("out of bounds")
+ throw EXCEPTION("str(): out of bounds")
return copytext(str, M.pos, M.pos+M.len)
pos(i)
if(!i) return 1
if(i < 1 || i > matches.len)
- ERROR("out of bounds")
+ throw EXCEPTION("pos(): out of bounds")
var/datum/match/M = matches[i]
return M.pos
len(i)
if(!i) return length(str)
if(i < 1 || i > matches.len)
- ERROR("out of bounds")
+ throw EXCEPTION("len(): out of bounds")
var/datum/match/M = matches[i]
return M.len
end(i)
if(!i) return length(str)
if(i < 1 || i > matches.len)
- ERROR("out of bounds")
+ throw EXCEPTION("end() out of bounds")
var/datum/match/M = matches[i]
return M.pos + M.len
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index e88a5579518..e5d13b03080 100644
--- a/code/__HELPERS/files.dm
+++ b/code/__HELPERS/files.dm
@@ -2,12 +2,12 @@
//returns text as a string if these conditions are met
/proc/return_file_text(filename)
if(fexists(filename) == 0)
- ERROR("File not found ([filename])")
+ throw EXCEPTION("return_file_text(): File not found")
return
var/text = file2text(filename)
if(!text)
- ERROR("File empty ([filename])")
+ throw EXCEPTION("return_file_text(): File empty")
return
return text
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index e9b60141730..1812411e7b4 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -63,7 +63,7 @@
var/obj/screen/alert/path_as_obj = text2path("/obj/screen/alert/[id]")
// BYOND magic-fu - we'll be storing a path in this reference and retrieving vars from it.
if(!path_as_obj)
- ERROR("[src] threw alert [category] with invalid path /obj/screen/alert/[id]")
+ throw EXCEPTION("throw_alert(): Invalid screen alert path") //check for obj/screen/alert/[id]
return 0
alert.name = initial(path_as_obj.name)
alert.desc = initial(path_as_obj.desc)
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index f2598097565..d578f1c501c 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -85,7 +85,7 @@ var/datum/subsystem/shuttle/SSshuttle
/datum/subsystem/shuttle/proc/requestEvac(mob/user, call_reason)
if(!emergency)
- ERROR("There is no emergency shuttle! The game will be unresolvable. This is likely due to a mapping error")
+ throw EXCEPTION("requestEvac(): There is no emergency shuttle! The game will be unresolvable. This is likely due to a mapping error")
return
if(world.time - round_start_time < config.shuttle_refuel_delay)
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index b8f364d015a..44182b23f04 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -80,6 +80,7 @@
/* Initializers */
/datum/ai_laws/malfunction/New()
..()
+ set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010")
switch(config.default_laws) //We don't want people metagaming malf, do we?
if(0)
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
@@ -92,16 +93,16 @@
add_inherent_law(line)
if(!inherent.len)
- ERROR("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
+ throw EXCEPTION("Invalid custom AI laws, check silicon_laws.txt")
+ return
if(2)
var/datum/ai_laws/lawtype = pick(typesof(/datum/ai_laws/default) - /datum/ai_laws/default)
var/datum/ai_laws/templaws = new lawtype()
inherent = templaws.inherent
- set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*´&110010")
/datum/ai_laws/custom/New() //This reads silicon_laws.txt and allows server hosts to set custom AI starting laws.
..()
@@ -111,11 +112,12 @@
add_inherent_law(line)
if(!inherent.len) //Failsafe to prevent lawless AIs being created.
- ERROR("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
+ throw EXCEPTION("Invalid custom AI laws, check silicon_laws.txt")
+ return
/* General ai_law functions */
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 7141e73825e..c21d96be8a3 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -63,7 +63,8 @@
/datum/mind/proc/transfer_to(mob/living/new_character)
if(!istype(new_character))
- ERROR("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform coderbus")
+ throw EXCEPTION("transfer_to(): new_character must be mob/living")
+ return
if(current) //remove ourself from our old body's mind variable
current.mind = null
@@ -1490,7 +1491,8 @@
if(ticker)
ticker.minds += mind
else
- ERROR("mind_initialize(): No ticker ready yet! Please inform coderbus")
+ spawn(0)
+ throw EXCEPTION("mind_initialize(): No ticker ready")
if(!mind.name) mind.name = real_name
mind.current = src
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 13fd5d40269..afed6be3354 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -183,7 +183,8 @@
/obj/effect/blob/proc/change_to(type)
if(!ispath(type))
- ERROR("[type] is an invalid type for the blob.")
+ throw EXCEPTION("change_to(): invalid type for blob")
+ return
var/obj/effect/blob/B = new type(src.loc)
if(!istype(type, /obj/effect/blob/core) || !istype(type, /obj/effect/blob/node))
B.color = color
diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm
index 99fce43f8e6..b2a41b3b30e 100644
--- a/code/game/gamemodes/gang/gang_datum.dm
+++ b/code/game/gamemodes/gang/gang_datum.dm
@@ -21,7 +21,8 @@
/datum/gang/New(loc,gangname)
if(!gang_colors_pool.len)
message_admins("WARNING: Maximum number of gangs have been exceeded!")
- ERROR("WARNING: Maximum number of gangs have been exceeded!")
+ throw EXCEPTION("Maximum number of gangs have been exceeded")
+ return
else
color = pick(gang_colors_pool)
gang_colors_pool -= color
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index ff133d7980c..7e14fb75726 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -428,5 +428,6 @@ This is here to make the tiles around the station mininuke change when it's arme
log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y] ,[diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).")
return QDEL_HINT_HARDDEL_NOW
else
- ERROR("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.")
- return QDEL_HINT_LETMELIVE // Cancel destruction.
+ . = QDEL_HINT_LETMELIVE // Cancel destruction
+ throw EXCEPTION("Unable to find a blobstart landmark")
+ return
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 84c32da87c0..5cf2ffbd776 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -23,10 +23,10 @@
if(!stat)
if (!network)
- ERROR("A computer lacks a network at [x],[y],[z].")
+ throw EXCEPTION("No camera network")
return
if (!(istype(network,/list)))
- ERROR("The computer at [x],[y],[z] has a network that is not a list!")
+ throw EXCEPTION("Camera network is not a list")
return
if(..())
@@ -44,10 +44,12 @@
D["Cancel"] = "Cancel"
for(var/obj/machinery/camera/C in L)
if(!C.network)
- ERROR("[C.c_tag] has no camera network.")
+ spawn(0)
+ throw EXCEPTION("Camera in a cameranet has no camera network")
continue
if(!(istype(C.network,/list)))
- ERROR("[C.c_tag]'s camera network is not a list!")
+ spawn(0)
+ throw EXCEPTION("Camera in a cameranet has a non-list camera network")
continue
var/list/tempnetwork = C.network&network
if(tempnetwork.len)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 959f6792a67..43d313fec05 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -843,7 +843,8 @@ var/list/obj/machinery/newscaster/allCasters = list()
var/mob/living/silicon/ai_user = user
scanned_user = "[ai_user.name] ([ai_user.job])"
else
- ERROR("Newscaster used by non-human/silicon mob: [user.type]")
+ throw EXCEPTION("Invalid user for this proc")
+ return
/obj/machinery/newscaster/proc/print_paper()
feedback_inc("newscaster_newspapers_printed",1)
diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm
index 3186b0c2960..fc6c39c5b76 100644
--- a/code/game/machinery/telecomms/computers/traffic_control.dm
+++ b/code/game/machinery/telecomms/computers/traffic_control.dm
@@ -143,7 +143,7 @@
if(auth)
id = "[auth.registered_name] ([auth.assignment])"
else
- ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])")
+ throw EXCEPTION("null auth while the user isn't a silicon")
return
access_log += "\[[get_timestamp()]\] [id] [entry]"
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 529e3d906fc..3021a0ba8aa 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -3,7 +3,7 @@
soundin = get_sfx(soundin) // same sound for everyone
if(isarea(source))
- ERROR("[source] is an area and is trying to make the sound: [soundin]")
+ throw EXCEPTION("playsound(): source is an area")
return
var/frequency = get_rand_frequency() // Same frequency for everybody
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 0fa01cb6319..edbdb87b62d 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -10,8 +10,10 @@ var/list/admin_ranks = list() //list of all admin_rank datums
name = init_name
switch(name)
if("Removed",null,"")
- ERROR("invalid admin-rank name. datum deleted")
- del(src)
+ spawn(-1)
+ del(src)
+ throw EXCEPTION("invalid admin-rank name")
+ return
if(init_rights) rights = init_rights
if(!init_adds) init_adds = list()
if(!init_subs) init_subs = list()
@@ -178,7 +180,7 @@ var/list/admin_ranks = list() //list of all admin_rank datums
var/ckey = ckey(query.item[1])
var/rank = ckeyEx(query.item[2])
if(rank_names[rank] == null)
- error("Admin rank ([rank]) does not exist.")
+ WARNING("Admin rank ([rank]) does not exist.")
continue
var/datum/admins/D = new(rank_names[rank], ckey) //create the admin datum and store it for later use
if(!D) continue //will occur if an invalid rank is provided
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 194a4437e55..5d96718e647 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -582,8 +582,8 @@ var/list/admin_verbs_hideable = list(
var/error_extra = ""
if(!config.admin_legacy_system)
error_extra = " Check mysql DB connection."
- error("Error while re-adminning [src], admin rank ([rank]) does not exist.[error_extra]")
src << "Error while re-adminning, admin rank ([rank]) does not exist.[error_extra]"
+ WARNING("Error while re-adminning [src], admin rank ([rank]) does not exist.[error_extra]")
return
D = new(rank_names[rank],ckey)
var/client/C = directory[ckey]
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 05a7a5ebeaf..cd90514e7c4 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -16,12 +16,14 @@ var/list/admin_datums = list()
/datum/admins/New(datum/admin_rank/R, ckey)
if(!ckey)
- ERROR("Admin datum created without a ckey argument. Datum has been deleted")
- del(src)
+ spawn(-1)
+ del(src)
+ throw EXCEPTION("Admin datum created without a ckey")
return
if(!istype(R))
- ERROR("Admin datum created without a rank. Datum has been deleted")
- del(src)
+ spawn(-1)
+ del(src)
+ throw EXCEPTION("Admin datum created without a rank")
return
rank = R
admincaster_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 11ebe6edb27..1ebbb0d9332 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -130,7 +130,8 @@
else
src << "Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug."
ghostize()
- ERROR("A borg has been destroyed, but its MMI lacked a brainmob, so the mind could not be transferred. Player: [ckey].")
+ spawn(0)
+ throw EXCEPTION("Borg MMI lacked a brainmob")
mmi = null
if(connected_ai)
connected_ai.connected_robots -= src
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index 4ade64d3605..c9e36f27b46 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -155,7 +155,8 @@ Contents:
Ninja.internals.icon_state = "internal1"
if(Ninja.mind != Mind) //something has gone wrong!
- ERROR("The ninja wasn't assigned the right mind. ;ç;")
+ throw EXCEPTION("Ninja created with incorrect mind")
+ return
Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index cd8c7258b05..d4760e76b74 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -306,7 +306,7 @@ var/const/SIGNAL_COOLDOWN = 20 // 2 seconds
var/obj/item/device/radio/hradio = S.server_radio
if(!hradio)
- ERROR("[src] has no radio.")
+ throw EXCEPTION("tcombroadcast(): signal has no radio")
return
if((!message) && message != 0)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index dfbb6085368..7b6d2e68add 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -221,7 +221,8 @@
//call the shuttle to destination S
/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S)
if(canDock(S))
- ERROR("[type](\"[name]\") cannot dock at [S]\")")
+ . = 1
+ throw EXCEPTION("request(): shuttle cannot dock")
return 1 //we can't dock at S
switch(mode)
@@ -272,7 +273,7 @@
/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1)
. = canDock(S1)
if(.)
- ERROR("[type](\"[name]\") cannot dock at [S1]")
+ throw EXCEPTION("dock(): shuttle cannot dock")
return .
if(canMove())